キャッシュ内のリストの動作と使用法
リストは、データをリストに追加またはリストから削除できる順序付けられていないデータ構造です。 たとえば、リストは、e コマース Web サイトのカートに追加された製品を維持します。 ユーザーが製品 Umbrella、Green Apples、および Coffee をカートに追加したとします。 トランザクションを行う前に、製品 Green Apples が削除され、新しい製品 Pears が追加されます。 これが可能なのは、リスト内の任意のポイントからリストを更新できるためです。
NCache を提供することにより、リスト データ構造をさらに強化します。 NCache- などの特有の機能 グループ, タグ, 満了, ロッキング, 依存関係、 もっと。 このシナリオでは、会社はセッションがアクティブな間だけカート リストを維持したいと考えています。 したがって、有効期限は、セッション タイムアウト値と等しい、作成された各リストに関連付けることができます。
行動
- リストは、任意のプリミティブ型またはカスタムオブジェクトにすることができます。
- の一覧
CacheItem
ネストされたリストはまだサポートされていません。
- リストには、インデックスから直接アクセスできます。
- リストには名前が付けられます。 したがって、リストに一意のキャッシュ キーを提供する必要があります。
- Nullはサポートされている値型ではありません。
- 重複する値がサポートされています。
前提条件
- すべてを使用するために必要な標準的な前提条件について学習するには NCache クライアント側の機能については、次のページを参照してください。 クライアント側 API の前提条件.
- APIの詳細については、以下を参照してください。 Iキャッシュ, IDistributedList, IDataTypeManager, リストの作成, 追加範囲, 頭で挿入, リストの取得, 削除範囲, IList, 登録通知, DataTypeDataNotificationCallback, イベントタイプ, データタイプイベントデータフィルター, ロック, アンロック.
- すべてを使用するために必要な標準的な前提条件について学習するには NCache クライアント側の機能については、次のページを参照してください。 クライアント側 API の前提条件.
- APIの詳細については、以下を参照してください。 キャッシュ, 分散リスト, getDataStructuresManager, リストの作成, 範囲の追加, 削除範囲, 頭に挿入, getList, DataStructureDataChangeListener, onDataStructureChanged, addChangeListener, イベントタイプ, getEventType, データタイプイベントデータフィルター, データ構造イベント引数, getCollectionItem, ロック, アンロック.
- すべてを使用するために必要な標準的な前提条件について学習するには NCache クライアント側の機能については、次のページを参照してください。 クライアント側 API の前提条件.
- APIの詳細については、以下を参照してください。 キャッシュ, 分散リスト, getDataStructuresManager, リストの作成, 範囲の追加, getList, 頭に挿入, 削除します, 削除範囲, DataStructureDataChangeListener, ロック, イベントタイプ, addChangeListener, データタイプイベントデータフィルター , データ構造イベント引数, getEventType, getCollectionItem, アンロック, DataStructureDataChangeListener.
- すべてを使用するために必要な標準的な前提条件について学習するには NCache クライアント側の機能については、次のページを参照してください。 クライアント側 API の前提条件.
- APIの詳細については、以下を参照してください。 キャッシュ, 分散リスト, データ構造マネージャー, get_data_structs_manager, リストの作成, 範囲の追加, get_list, 頭の部分に挿入, get_iterator, 削除範囲, get_event_type, add_change_listener , データタイプイベントデータフィルター, イベントデータフィルター.
リストを作成してデータを追加する
次のコードサンプルは、 プロダクト 型は次を使用してキャッシュ内に作成できます CreateList
キャッシュキーに対して 製品リスト。 製品は次を使用してリストに追加されます Add
を使用して、新しい範囲の製品がリストに追加されます。 AddRange
.
先端
また、ワイルドカード*を使用すると、任意の文字にマッチし、XNUMXつのコマンドで複数のファイルを削除することができます。 検索可能な属性を構成する グループ/タグ/名前付きタグなど 無効化属性 データ構造の作成中の有効期限/削除/依存関係など。
// 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
操作がフェイルセーフであることを保証するために、で説明されているように、アプリケーション内の潜在的な例外を処理することをお勧めします。 失敗の処理.
リスト内のアイテムを更新する
リストはインデックス経由でアクセスできるため、インデックスを使用してリストとその中のアイテムを更新できます。 次のコード サンプルでは、インデックスを使用して既存のリスト (前の例で作成) の値を更新します。 次に、セール品を取得し、次を使用してリストの最初のインデックスに追加します。 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)
キャッシュからリストを取得する
次を使用してキャッシュからリストを取得できます GetList
これはパラメータとしてキャッシュキーを受け取ります。 このキーは、リストの作成時に指定したリストの名前です。
警告
フェッチされるアイテムがリストタイプでない場合、 Type mismatch
例外がスローされます。
// 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")
リストからアイテムを削除する
個々の項目または指定された範囲の項目をリストから削除できます。 次のコード サンプルでは、次を使用して個々の項目を削除します。 Remove
を使用した期限切れ製品のさまざまなアイテム RemoveRange
.
Note
削除するように指定されたキーが存在しない場合は、何も返されません。 返されたキーの数は、戻り値の型を使用して確認できます。 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)
リストのイベント通知
リストなどのデータ構造に対して、キャッシュイベント、キーベースのイベント、データ構造イベントを登録できます。 動作については、を参照してください。 機能ごとの動作.
次のコードサンプルは、次のキャッシュイベントを登録します。 ItemAdded
および ItemUpdated
. また、イベントを登録します ItemAdded
および ItemUpdated
キャッシュ内のリストに。 キャッシュにリストを作成すると、 ItemAdded
キャッシュレベルのイベントが発生します。 ただし、項目をリストに追加すると、 ItemAdded
データ構造イベントと ItemUpdated
キャッシュレベルイベントが発生します。 あ DataTypeEventDataFilter
イベントの実行時に返される情報の量を定量化するために指定されます。 このように登録されたイベントは、これらのデータ フィルターに基づいてユーザーに情報を提供します。
作成されたリストにイベントを登録する
// 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)
イベント通知のコールバックを指定する
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)
ロックリスト
データの一貫性を確保するために、リストを明示的にロックおよびロック解除できます。 次のコードサンプルは、リストを作成し、それを使用して10秒間ロックします。 ロック、を使用してロックを解除します アンロック.
// 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();
その他のリソース
NCache リスト データ構造のサンプル アプリケーションを提供します。 GitHubの.
も参照してください
。ネット: Alachisoft.NCache.Client.DataTypes 名前空間
Java: comの。alachisoft.ncache.client.datastructs 名前空間
Node.js: 分散リスト とに提供されます。
Python: ncache.client.datastructs とに提供されます。