Verhalten und Verwendung im Cache auflisten
Eine Liste ist eine ungeordnete Datenstruktur, in der Daten hinzugefügt oder aus der Liste entfernt werden können. Beispielsweise enthalten Listen die Produkte, die einem Einkaufswagen für eine E-Commerce-Website hinzugefügt wurden. Angenommen, ein Benutzer legt die Produkte Regenschirm, grüne Äpfel und Kaffee in den Warenkorb. Vor Durchführung der Transaktion wird das Produkt Grüne Äpfel entfernt und ein neues Produkt Birnen hinzugefügt. Dies ist möglich, weil Sie die Liste von jedem Punkt aus aktualisieren können.
NCache Verbessert die Listendatenstruktur weiter durch die Bereitstellung NCache-Spezifische Funktionen wie z Groups, Schlüsselwörter, Ablauf, Sperrung, Abhängigkeiten, und mehr. In diesem Szenario möchte das Unternehmen, dass die Warenkorbliste nur so lange gepflegt wird, wie die Sitzung aktiv ist. Daher kann jeder erstellten Liste ein Ablauf zugeordnet werden, der gleich dem Sitzungszeitüberschreitungswert ist.
Verhalten
- Eine Liste kann einen beliebigen primitiven Typ oder ein benutzerdefiniertes Objekt haben.
- Eine Liste der
CacheItem
und verschachtelte Listen werden noch nicht unterstützt.
- Auf Listen kann direkt per Index zugegriffen werden.
- Listen werden benannt. Daher müssen Sie einen eindeutigen Cache-Schlüssel für eine Liste bereitstellen.
- Null ist kein unterstützter Werttyp.
- Doppelte Werte werden unterstützt.
Voraussetzungen:
- Lernen Sie die Standardvoraussetzungen kennen, die für die Arbeit mit allen erforderlich sind NCache Weitere Informationen zu clientseitigen Funktionen finden Sie auf der angegebenen Seite Clientseitige API-Voraussetzungen.
- Einzelheiten zur API finden Sie unter: ICache, IDistributedList, IDataTypeManager, Erstelle Liste, AddRange, InsertAtHead, GetList, Bereich entfernen, IList, Registrierungsbenachrichtigung, DataTypeDataNotificationCallback, Ereignistyp, DataTypeEventDataFilter, Zahnscheiben, öffne es.
- Lernen Sie die Standardvoraussetzungen kennen, die für die Arbeit mit allen erforderlich sind NCache Weitere Informationen zu clientseitigen Funktionen finden Sie auf der angegebenen Seite Clientseitige API-Voraussetzungen.
- Einzelheiten zur API finden Sie unter: Cache-Speicher, VerteilteListe, getDataStructuresManager, Erstelle Liste, addRange, Entfernungsbereich, InsertAtHead, getList, DataStructureDataChangeListener, onDataStructureChanged, Addchangelistener, Ereignistyp, GetEventType, DataTypeEventDataFilter, DataStructureEventArg, getCollectionItem, sperren, öffnen.
- Lernen Sie die Standardvoraussetzungen kennen, die für die Arbeit mit allen erforderlich sind NCache Weitere Informationen zu clientseitigen Funktionen finden Sie auf der angegebenen Seite Clientseitige API-Voraussetzungen.
- Einzelheiten zur API finden Sie unter: Cache-Speicher, VerteilteListe, getDataStructuresManager, Erstelle Liste, addRange, getList, InsertAtHead, entfernen, Entfernungsbereich, DataStructureDataChangeListener, sperren, Ereignistyp, Addchangelistener, DataTypeEventDataFilter , DataStructureEventArg, GetEventType, getCollectionItem, öffnen, DataStructureDataChangeListener.
- Lernen Sie die Standardvoraussetzungen kennen, die für die Arbeit mit allen erforderlich sind NCache Weitere Informationen zu clientseitigen Funktionen finden Sie auf der angegebenen Seite Clientseitige API-Voraussetzungen.
- Einzelheiten zur API finden Sie unter: Cache-Speicher, VerteilteListe, DataStructureManager, get_data_structures_manager, Erstelle Liste, add_range, get_list, insert_at_head, get_iterator, Entfernungsbereich, get_event_type, add_change_listener , DataTypeEventDataFilter, Ereignisdatenfilter.
Erstellen Sie eine Liste und fügen Sie die Daten hinzu
Das folgende Codebeispiel zeigt, wie eine Liste von Produkt Typen können mit im Cache erstellt werden CreateList
gegen den Cache-Schlüssel Produktliste. Produkte werden mit zur Liste hinzugefügt Add
, und dann wird mit ein neues Produktsortiment zur Liste hinzugefügt AddRange
.
// Precondition: Cache must be connected
// Specify unique cache key for list
string key = "ProductList";
// Create list of Product type
IDistributedList<Product> list = cache.DataTypeManager.CreateList<Product>(key);
// Get products to add to list
Product[] products = FetchProducts();
foreach (var product in products)
{
// Add products to list
list.Add(product);
}
// Get new products
Product[] newProducts = FetchNewProducts();
// Append list of new Products to existing list
list.AddRange(newProducts);
// Precondition: Cache must be connected
// Specify unique cache key for list
String key = "ProductList";
// Create a list of Product type
DistributedList<Product> list = cache.getDataStructuresManager().createList(key, Product.class);
// Get products to add to list
Product[] products = fetchProducts();
for (var product : products) {
// Add products to list
list.add(product);
}
// Get new products
Product[] newProducts = fetchNewProducts();
// Append list of new Products to existing list
list.addRange(Arrays.asList(newProducts));
// This is an async method
// Precondition: Cache must be connected
// Specify unique cache key for list
var key = "ProductList";
// Create list
var manager = await this.cache.getDataStructuresManager();
var list = await manager.createList(key, ncache.JsonDataType.Object);
// Get products to add to list
var products = this.fetchProducts();
for (var product in products) {
// Add products to list
list.add(product);
}
// Get new products
var newProducts = this.fetchNewProducts();
// Append list of new Products to existing list
list.addRange(newProducts);
# Precondition: Cache must be connected
# Specify unique cache key for list
key = "ProductList"
# Create list
manager = cache.get_data_structures_manager()
product_list = manager.create_list(key, Product)
# Get products to add to list
products = fetch_products()
for product in products:
# Add products to list
product_list.add(product)
# Get new products
new_products = fetch_new_products()
# Append list of new Products to existing list
product_list.add_range(new_products)
Note
Um sicherzustellen, dass der Vorgang ausfallsicher ist, wird empfohlen, alle potenziellen Ausnahmen in Ihrer Anwendung zu behandeln, wie in erläutert Umgang mit Fehlern.
Elemente in der Liste aktualisieren
Sie können Listen und darin enthaltene Elemente mithilfe von Indizes aktualisieren, da auf die Listen über den Index zugegriffen werden kann. Das folgende Codebeispiel aktualisiert einen Wert in einer vorhandenen Liste (die im vorherigen Beispiel erstellt wurde) mithilfe des Index. Es erhält dann einen Verkaufsartikel und fügt ihn mit dem ersten Index der Liste hinzu InsertAtHead
.
// "list" is created in previous example
// Update value of index with updated product
Product updatedProduct = GetUpdatedProductByID(11);
list[11] = updatedProduct;
// Get product on sale to insert at head of List
Product saleProduct = FetchSaleItem();
list.InsertAtHead(saleProduct);
// Precondition: Cache is already connected
// "list" is created in previous example
// Update value of index with updated product
Product updatedProduct = getUpdatedProductByID(11);
list.add(11, updatedProduct);
// Get product on sale to insert at head of List
Product saleProduct = fetchSaleItem();
list.insertAtHead(saleProduct);
// This is an async method
// Precondition: Cache is already connected
// "list" is created in previous example
// Update value of index with updated product
var updatedProduct = this.getUpdatedProductByID(11);
list.add(11, updatedProduct);
// Get product on sale to insert at head of List
var saleProduct = this.fetchSaleItem();
list.insertAtHead(fetchSaleItem);
# Precondition: Cache is already connected
# "product_list" is created in previous example
# Update value of index with updated product
updated_product = get_updated_product_by_id(1011)
product_list .add(updated_product, 1011)
# Get product on sale to insert at head of List
sale_product = fetch_sale_item()
product_list .insert_at_head(sale_product)
Liste aus Cache abrufen
Sie können eine Liste aus dem Cache abrufen mit GetList
das einen Cache-Schlüssel als Parameter akzeptiert. Dieser Schlüssel ist der Name der Liste, die bei der Listenerstellung angegeben wurde.
Warnung
Wenn das abgerufene Element nicht vom Typ Liste ist, a Type mismatch
Ausnahme wird ausgelöst.
// List with this key already exists in cache
string key = "ProductList";
// Get list and show items of list
IDistributedList<Product> retrievedList = cache.DataTypeManager.GetList<Product>(key);
if (retrievedList != null)
{
foreach (var item in retrievedList)
{
// Perform operations
}
}
else
{
// List does not exist
}
// Precondition: Cache is already connected
// List with this key already exists in cache
String key = "ProductList";
// Get list and show items of list
DistributedList<Product> retrievedList = cache.getDataStructuresManager().getList(key, Product.class);
if (retrievedList != null) {
for (var item : retrievedList) {
// Perform operations
}
} else {
// List does not exist
}
// This is an async method
// Precondition: Cache is already connected
// List with this key already exists in cache
var key = "ProductList";
// Get list and show items of list
var manager = await this.cache.getDataStructuresManager();
var retrievedList = await manager.getList(key, ncache.JsonDataType.Object);
if (retrievedList != null) {
for (var item in retrievedList) {
// Perform operations
}
} else {
// List does not exist
}
# Precondition: Cache is already connected
# List with this key already exists in cache
key = "ProductList"
# Get list and show items of list
manager = cache.get_data_structures_manager()
retrieved_list = manager.get_list(key, Product)
if retrieved_list is not None:
for item in retrieved_list.get_iterator():
# Perform operations
print(item)
else:
# List does not exist
print("List not found")
Elemente aus der Liste entfernen
Einzelne Artikel oder ein bestimmter Artikelbereich können aus einer Liste entfernt werden. Das folgende Codebeispiel entfernt ein einzelnes Element mit Remove
und eine Reihe von Artikeln für die Verwendung abgelaufener Produkte RemoveRange
.
Note
Wenn der zu entfernende Schlüssel nicht vorhanden ist, wird nichts zurückgegeben. Sie können die Anzahl der zurückgegebenen Schlüssel mithilfe des Rückgabetyps überprüfen RemoveRange
.
// List with this key already exists in cache
string key = "ProductList";
// Get list to remove items
IDistributedList<Product> retrievedList = cache.DataTypeManager.GetList<Product>(key);
// Get range of out of stock products to be removed
List<Product> outOfStockProducts = FetchOutOfStockProducts();
// Remove each item individually from retrievedList
foreach(Product prod in outOfStockProducts)
{
retrievedList.Remove(prod);
}
// Get range of discontinued products to be removed
List<Product> discontinuedProducts = FetchDiscontinuedProducts();
// Remove this range from retrievedList
// Number of keys removed is returned
int itemsRemoved = retrievedList.RemoveRange(discontinuedProducts);
// Precondition: Cache is already connected
// List with this key already exists in cache
String key = "ProductList";
// Get list to remove items
DistributedList<Product> retrievedList = cache.getDataStructuresManager().getList(key, Product.class);
// Get range of out of stock products to be removed
List<Product> outOfStockProducts = fetchOutOfStockProducts();
// Remove an individual item from retrieved list
for(Product prod : outOfStockProducts)
{
retrievedList.remove(prod);
}
// Get range of discontinued products to be removed
List<Product> discontinuedProducts = fetchDiscontinuedProducts();
// Remove this range from retrievedList
// Number of keys removed is returned
int itemsRemoved = retrievedList.removeRange(discontinuedProducts);
// This is an async method
// Precondition: Cache is already connected
// List with this key already exists in cache
var key = "ProductList";
// Get list to remove items
var manager = await this.cache.getDataStructuresManager();
var retrievedList = await manager.getList(key, ncache.JsonDataType.Object);
// Get range of out of stock products to be removed
var outOfStockProducts = this.fetchOutOfStockProducts();
// Remove an individual item from retrieved list
for(var prod in outOfStockProducts){
await retrievedList.remove(prod);
}
// Get range of discontinued json datatype products to be removed
var discontinuedProducts = this.fetchDiscontinuedProducts();
// Remove this range from retrievedList
// Number of keys removed is returned
var itemsRemoved = await retrievedList.removeRange(discontinuedProducts);
# Precondition: Cache is already connected
# List with this key already exists in cache
key = "ProductList"
# Get list to remove items
manager = cache.get_data_structures_manager()
retrieved_list = manager.get_list(key, Product)
# Get range of expired products to be removed
items_to_remove = fetch_expired_products()
# Remove this range from retrievedList
# Number of keys removed is returned
items_removed = retrieved_list.remove_range(collection=items_to_remove)
Ereignisbenachrichtigungen auf Listen
Sie können Cache-Ereignisse, schlüsselbasierte Ereignisse und Datenstrukturereignisse in einer Datenstruktur wie einer Liste registrieren. Zum Verhalten siehe funktionsbezogenes Verhalten.
Das folgende Codebeispiel registriert ein Cache-Ereignis von ItemAdded
und ItemUpdated
. Es registriert auch ein Ereignis für ItemAdded
und ItemUpdated
auf der Liste im Cache. Sobald Sie eine Liste im Cache erstellt haben, wird eine ItemAdded
Ein Ereignis auf Cache-Ebene wird ausgelöst. Sobald Sie jedoch ein Element zur Liste hinzufügen, wird ein ItemAdded
Datenstrukturereignis, zusammen mit einem ItemUpdated
Das Ereignis auf Cache-Ebene wird ausgelöst. A DataTypeEventDataFilter
wird angegeben, um die Menge an Informationen zu quantifizieren, die bei einer Ereignisausführung zurückgegeben werden. Auf diese Weise registrierte Ereignisse liefern dem Benutzer dann die Informationen basierend auf diesen Datenfiltern.
Ereignis in der erstellten Liste registrieren
// Pre-condition: Cache is connected
// Unique cache key for list
string key = "ProductList";
// Create list of Product type
IDistributedList<Product> list = cache.DataTypeManager.CreateList<Product>(key);
// Register ItemAdded, ItemUpdated, ItemRemoved events on list created
// DataTypeNotificationCallback is callback method specified
list.RegisterNotification(DataTypeDataNotificationCallback, EventType.ItemAdded |
EventType.ItemUpdated | EventType.ItemRemoved,
DataTypeEventDataFilter.Data);
// Perform operations
// Precondition: Cache is already connected
// Unique cache key for list
String key = "ProductList";
// Create list of product type
DistributedList<Product> list = cache.getDataStructuresManager().createList(key, Product.class);
// Register ItemAdded, ItemUpdated, ItemRemoved events on list created
// dataChangeListener is the specified callback method
DataStructureDataChangeListener dataChangeListener = dataStructureListener.onDataStructureChanged(collectionName, args);
EnumSet<EventType> enumSet = EnumSet.of(com.alachisoft.ncache.runtime.events.EventType.ItemAdded,
EventType.ItemUpdated, EventType.ItemRemoved);
list.addChangeListener(dataChangeListener, enumSet, DataTypeEventDataFilter.Data);
// Perform operations
// This is an async method
// Precondition: Cache is already connected
// Unique cache key for list
var key = "ProductList";
// Create list
var list = await this.cache
.getDataStructuresManager()
.createList(key, ncache.JsonDataType.Object);
// Register ItemAdded, ItemUpdated, ItemRemoved events on list created
// dataChangeListener is the specified callback method
var dataChangeListener = this.dataStructureListener.onDataStructureChanged(
collectionName,
args
);
var enumSet = enumSet.of(
ncache.EventType.ItemAdded,
ncache.EventType.ItemUpdated,
ncache.EventType.ItemRemoved
);
list.addChangeListener(
dataChangeListener,
enumSet,
ncache.DataTypeEventDataFilter.Data
);
// Perform operations
def datastructure_callback_function(collection_name, collection_event_args):
# Perform Operations
print("Event Fired for " + str(collection_name))
# Precondition: Cache is already connected
# Unique cache key for list
key = "ProductList"
# Create list
product_list = cache.get_data_structures_manager().create_list(key, Product)
# Register ItemAdded, ItemUpdated, ItemRemoved events on list created
events_list = [ncache.EventType.ITEM_ADDED, ncache.EventType.ITEM_UPDATED, ncache.EventType.ITEM_REMOVED]
product_list.add_change_listener(datastructure_callback_function, events_list, ncache.DataTypeEventDataFilter.DATA)
Geben Sie einen Rückruf für die Ereignisbenachrichtigung an
private void DataTypeDataNotificationCallback(string collectionName, DataTypeEventArg collectionEventArgs)
{
switch (collectionEventArgs.EventType)
{
case EventType.ItemAdded:
// Item has been added to the collection
break;
case EventType.ItemUpdated:
if (collectionEventArgs.CollectionItem != null)
{
// Item has been updated in the collection
// Perform operations
}
break;
case EventType.ItemRemoved:
// Item has been removed from the collection
break;
}
}
DataStructureDataChangeListener dataStructureListener = new DataStructureDataChangeListener() {
@Override
public void onDataStructureChanged(String collection, DataStructureEventArg dataStructureEventArg) {
switch (dataStructureEventArg.getEventType()) {
case ItemAdded:
// Item has been added to the collection
break;
case ItemUpdated:
if (dataStructureEventArg.getCollectionItem() != null) {
//Item has been updated in the collection
// Perform operations
}
break;
case ItemRemoved:
//Item has been removed from the collection
break;
}
}
};
dataStructureListener = new ncache.DataStructureDataChangeListener();
{
function onDataStructureChanged(collection, dataStructureEventArg) {
switch (dataStructureEventArg.getEventType()) {
case ncache.EventType.ItemAdded:
//Item has been added to the collection
break;
case ncache.EventType.ItemUpdated:
if (dataStructureEventArg.getCollectionItem() != null) {
//Item has been updated in the collection
// perform operations
}
break;
case ncache.EventType.ItemRemoved:
//Item has been removed from the collection
break;
}
}
}
def datastructure_callback_function(collection_name: str, collection_event_args: DataStructureEventArg):
if collection_event_args.get_event_type() is ncache.EventType.ITEM_ADDED:
# Item has been added to the collection
print("Item added in " + collection_name)
elif collection_event_args.get_event_type() is ncache.EventType.ITEM_UPDATED:
# Item has been updated in the collection
print("Item updated in " + collection_name)
elif collection_event_args.get_event_type() is ncache.EventType.ITEM_REMOVED:
# Item has been removed from the collection
print("Item removed from " + collection_name)
Sperrlisten
Listen können explizit gesperrt und entsperrt werden, um die Datenkonsistenz sicherzustellen. Das folgende Codebeispiel erstellt eine Liste und sperrt sie für einen Zeitraum von 10 Sekunden mit Zahnscheibenund entsperrt es dann mit öffne es.
// List exists with key "ProductList"
string key = "ProductList";
// Get list
IDistributedList<Product> list = cache.DataTypeManager.GetList<Product>(key);
// Lock list for 10 seconds
bool isLocked = list.Lock(TimeSpan.FromSeconds(10));
if (isLocked)
{
// List is successfully locked for 10 seconds
// Unless explicitly unlocked
}
else
{
// List is not locked because either:
// List is not present in the cache
// List is already locked
}
list.Unlock();
// Preconditions: Cache is already connected
// List exists with key "ProductList"
String key = "ProductList";
// Get list
DistributedList<Product> list = cache.getDataStructuresManager().getList(key, Product.class);
// Lock list for 10 seconds
boolean isLocked = list.lock(TimeSpan.FromSeconds(10));
if (isLocked) {
// List is successfully locked for 10 seconds
// Unless explicitly unlocked
} else {
// List is not locked because either:
// List is not present in the cache
// List is already locked
}
list.unlock();
Weitere Informationen
NCache stellt eine Beispielanwendung für die Listendatenstruktur bereit GitHub.
Siehe auch
.NETZ: Alachisoft.NCache.Client.Datentypen Namespace.
Java: com.alachisoft.ncache.client.Datenstrukturen Namespace.
Node.js: VerteilteListe Klasse.
Python: ncache.client.Datenstrukturen Klasse.