Using Write-behind Cache
This section explains the use of Write-behind mode after deploying and configuring the Write-Through provider. Write-behind updates the data source asynchronously after updating the cache.
Important
For Java, before deploying your JAR files, ensure that your Environment Variable for Java Home is set and have the appropriate JDK installed as discussed in the NCache Installation Guide.
Prerequisites
- To learn about the standard prerequisites required to work with all NCache server-side features please refer to the given page on Server Side API Prerequisites.
- For API details refer to: CacheItem, Get, Insert, IWriteThruProvider, Remove, InsertBulk, RemoveBulk, InsertAsync, RemoveAsync.
Add/Update with Write-behind
You can add/update cache items with or without callback in the cache along with Write-behind enabled. Adding with callback notifies you on the type of event occurred which you register.
Add without Callback Method
The following example adds an item in the cache with Write-behind enabled, using the Insert()
method. Using this method, if an item is already present in the cache, the new value overwrites the old value.
// Pre-Condition: Cache is already connected
// Specify the key of the cacheItem
Product product = FetchProductByProductID(1001);
string key = $"product:ProductID";
var cacheItem = new CacheItem(product);
// Enable write through for the cacheItem created
var writeThruOptions = new WriteThruOptions();
writeThruOptions.Mode = WriteMode.WriteBehind;
// Add item in the cache with Write-behind
cache.Insert(key, cacheItem, writeThruOptions);
Note
To ensure the operation is fail-safe, it is recommended to handle any potential exceptions within your application, as explained in Handling Failures.
Add with Callback Method
The following example adds an item in the cache with callback registered and event type of ItemAdded
with Write-behind enabled.
// Specify the key of the cacheItem
Product product = FetchProductByProductID(1001);
string key = $"product:ProductID";
var cacheItem = new CacheItem(product);
// Enable write through for the cacheItem created
var writeThruOptions = new WriteThruOptions();
writeThruOptions.Mode = WriteMode.WriteBehind;
writeThruOptions.SetDataSourceNotification(DataSourceModifiedCallBack, EventType.ItemAdded);
// Add item in the cache with Write-behind
cache.Insert(key, cacheItem, writeThruOptions);
Remove Existing Data with Write-behind
The following example removes the item from the cache with Write-behind enabled, using the Remove
method, corresponding to the key provided as well as from the data source and registers the events for the operation.
// Specify the key of the item
string key = "Product:1001";
// Enable write through for the cacheItem created
var writeThruOptions = new WriteThruOptions();
writeThruOptions.Mode = WriteMode.WriteBehind;
writeThruOptions.SetDataSourceNotification(DataSourceModifiedCallBack, EventType.ItemRemoved);
// Remove the item corresponding to the key with write-through enabled
cache.Remove(key, null, null, writeThruOptions);
Bulk Operations
Add/Update Bulk Items with Write-behind
The following example adds bulk items in the cache with Write-behind enabled, using the InsertBulk()
method. If the items are already present in the cache, new values overwrite the existing values.
// Fetch all products from database
Product[] products = FetchProductsFromDB();
var writeThruOptions = new WriteThruOptions();
writeThruOptions.Mode = WriteMode.WriteBehind;
writeThruOptions.SetDataSourceNotification(DataSourceModifiedCallBack, EventType.ItemAdded);
writeThruOptions.SetDataSourceNotification(DataSourceModifiedCallBack, EventType.ItemUpdated);
IDictionary<string, CacheItem> dictionary = new Dictionary<string, CacheItem>();
foreach(var product in products)
{
string key = $"Product:{product.ProductID}";
var cacheItem = new CacheItem(product);
dictionary.Add(key, cacheItem);
}
IDictionary<string, Exception> keysFailedToUpdate = cache.InsertBulk(dictionary, writeThruOptions);
Remove Existing Items with Write-behind
The following example removes a bulk of items from the cache with Write-behind enabled, using the RemoveBulk()
method.
// Get Keys
Product[] products = FetchProductsFromDB();
// Specify keys to remove from cache
string[] keys = new string[products.Length];
int index = 0;
foreach (var product in products)
{
keys[index] = $"Product:{product.ProductID}";
index++;
}
// Create dictionary to store removed items
IDictionary<string, Product> removedItems = new Dictionary<string,Product>();
var writeThruOptions = new WriteThruOptions();
writeThruOptions.Mode = WriteMode.WriteBehind;
writeThruOptions.SetDataSourceNotification(DataSourceModifiedCallBack, EventType.ItemRemoved);
// Remove items with Write-behind enabled
cache.RemoveBulk(keys, out removedItems, writeThruOptions);
Note
Use the method OnDataSourceItemsRemoved()
to perform operations after data removal from the cache.
Asynchronous Operations
Add/Update Item with Write-behind
The following example adds item asynchronously in cache with Write-behind enabled, using the InsertAsync()
method.
// Get product from database against given product ID
Product product = FetchProductFromDB(1001);
// Generate a unique cache key for this product
string key = $"Product:{product.ProductID}";
var cacheItem = new CacheItem(product);
// Enable write behind for the cacheItem created
var writeThruOptions = new WriteThruOptions();
writeThruOptions.Mode = WriteMode.WriteBehind;
writeThruOptions.SetDataSourceNotification(DataSourceModifiedCallBack, EventType.ItemAdded);
// Add Product object to cache
Task task = cache.InsertAsync(key, cacheItem, writeThruOptions);
Remove the Item with Write-behind
The following example removes existing items asynchronously from the cache with Write-behind enabled, using the RemoveAsync()
method.
// Unique cache key of product to remove
string key = $"Product:{product.ProductID}";
// Enable write behind for the cacheItem created
var writeThruOptions = new WriteThruOptions();
writeThruOptions.Mode = WriteMode.WriteBehind;
writeThruOptions.SetDataSourceNotification(DataSourceModifiedCallBack, EventType.ItemRemoved);
// Asynchronously remove items from cache
Task<Product> task = cache.RemoveAsync<Product>(key, writeThruOptions);
Use Data Structures with Write-behind
The following example uses different data structures with Write-behind enabled, on the specified item.
// Specify the key of the item
string key = "Product:1001";
var dataTypeAttributes = new DataTypeAttributes();
var writeThruOptions = new WriteThruOptions(WriteMode.WriteBehind, WriteThruProviderName);
switch(mainMenu)
{
case mainMenu.GetDistributedCounter:
// Modify or add count of the corresponding item with write thru enabled
var distributedCounter = cache.DataTypeManager.CreateCounter("counter", dataTypeAttributes, 0, writeThruOptions);
// perform operations on counter
break;
case mainMenu.GetDistributedDictionary:
// Modify or add dictionary of the corresponding item with write thru enabled
var distributedDictionary = cache.DataTypeManager.CreateDictionary<string, int>(key, dataTypeAttributes, writeThruOptions);
// perform operations on dictionary
break;
case mainMenu.GetDistributedList:
// Modify or add the list of the corresponding item with write thru enabled
var distributedList = cache.DataTypeManager.CreateList<int>("list", dataTypeAttributes, writeThruOptions);
// perform operations on list
break;
case mainMenu.GetDistributedQueue:
// Modify or add the queue of the corresponding item with read thru enabled
var distributedQueue = cache.DataTypeManager.CreateQueue<int>("queue", dataTypeAttributes, writeThruOptions);
// perform operations on queue
break;
case mainMenu.GetDistributedHashSet:
// Modify or add the HashSet of the corresponding item with read thru enabled
var distributedHashSet = cache.DataTypeManager.CreateHashSet<int>("hashset", dataTypeAttributes, writeThruOptions);
// perform operations on hashset
break;
}
Additional Resources
NCache provides sample application for Write-behind on GitHub.
See Also
.NET: Alachisoft.NCache.Runtime namespace.
Java: com.alachisoft.ncache.runtime.datasourceprovider namespace.