Cache Data Dependency on File
Note
This feature is only available in NCache Enterprise Edition.
File dependency provides a mechanism to invalidate the cache data in case of
non-relational data sources. Here you can associate a file/folder dependency
with a cache item. Whenever that file/folder is removed or modified, NCache will
remove its dependent item from cache. Cache clean up thread
monitors the dependent file/folder for any change at every CleanInterval
.
On cache clean up thread, NCache triggers dependency in the following scenarios:
- Dependency file is removed/modified.
- Dependency folder is removed/modified.
- Dependency is created in the non-existed file/folder, but on the cleanup interval it is created.
Similarly, multiple items can depend on a single file. Any change in file, either by updating the file or deletion, causes the cache to remove the dependent items from the cache. Likewise, an item can create dependency on multiple files in file dependency.
You can also provide a delay called startAfter
in file dependency which
indicates when to start monitoring the dependent file for any change. In this
way NCache will start checking the dependent file after the startAfter
time
has elapsed.
Pre-Requisites
- Include the following namespace in your application:
Alachisoft.NCache.Client
Alachisoft.NCache.Runtime.Dependencies
Alachisoft.NCache.Runtime.Exceptions
- The application must be connected to cache before performing the operation.
- Cache must be running.
- Make sure that the data being added is serializable.
- To ensure the operation is fail safe, it is recommended to handle any potential exceptions within your application, as explained in Handling Failures.
Important
Make sure that the NCache service has access to the file path where the file to be dependent on is placed.
Add Data to Cache with File Dependency
CacheItem is a custom class provided by NCache which can be used to add data to the cache and also lets you set additional metadata associated with an object of this class. This metadata defines the properties of the item like dependencies, expirations and more. You can refer to all properties of CacheItem here. For Java, use the setDependency property of the CacheItem
to add file dependency with an item.
The Add
method adds a new item in the cache whereas the Insert
method adds a new item with dependency and if the item already exists in the cache it overwrites its properties.
Important
Note that this API also specifies cache item priority for eviction as well as expiration, so the value for that parameter has been passed as Default
, as it is not discussed here.
In the following example, the data added in the cache is the content of the file placed at the specified path as a CacheItem
with dependency on the file. Any change in the file will result in the expiration of the
dependent data present in the cache. The expired items will then be removed at the cache CleanInterval
.
try
{
// Pre-Condition: Cache is already connected
// Generate a unique key for the fileData
string key = "FileData";
// Get the content of the file as string
string FileData = cache.Get<string>(key);
// Check if the fileData is already in the cache
if (string.IsNullOrEmpty(FileData))
{
// Read the contents of the file placed at the path
using (var streamReader = new StreamReader(@"D:\\Dependency.txt"))
{
FileData = streamReader.ReadToEnd();
}
}
// Specify the file path to add dependency on the file
string filepath = "D:\\Dependency.txt";
// Create a new cacheItem with filedata
var cacheItem = new CacheItem(FileData);
// Create the dependency on the file on the specified path
cacheItem.Dependency = new FileDependency(filepath);
// Add the file data in the cache with dependency on the file
cache.Insert(key, cacheItem);
}
catch (OperationFailedException ex)
{
// NCache specific exception
// Exception can occur due to:
// Connection Failures
// Operation Timeout
// Operation performed during state transfer
}
catch (Exception ex)
{
// Any generic exception like ArgumentNullException or ArgumentException
}
Recommendation: To ensure the operation is fail safe, it is recommended to handle any potential exceptions within your application, as explained in Handling Failures.
Trigger File Dependency with Delay
If you want to add dependency to an item which is triggered after a particular time, NCache allows you to specify the time interval for that.
The Add method adds a new item in the cache whereas the Insert method adds a new item with dependency and if the item already exists in the cache it overwrites its properties.
Important
Note that this API also specifies cache item priority for eviction as well as expiration, so the value for that parameter has been passed as Default
, as it is not discussed here.
In the following example, the data added in the cache is the content of the file placed at the specified path with dependency on the file. The dependency will be triggered after a span of 20 minutes. Any change in the file will result in the expiration of the
dependent data present in the cache. The expired items will then be removed at the cache CleanInterval
.
try
{
// Pre-Condition: Cache is already connected
// Generate a unique key for the fileData
string key = "FileData";
// Get the content of the file as string
string FileData = cache.Get<string>(key);
// Check if the fileData is already in the cache
if (string.IsNullOrEmpty(FileData))
{
// Read the contents of the file placed at the path
using (var streamReader = new StreamReader(@"D:\\Dependency.txt"))
{
FileData = streamReader.ReadToEnd();
}
}
// Specify the file path to add dependency on the file
string filepath = "D:\\Dependency.txt";
// Create a new CacheItem with the key
var cacheItem = new CacheItem(FileData);
// Create the dependency on the file on the specified path
// The dependency starts after 20 minutes
cacheItem.Dependency = new FileDependency(filepath, DateTime.Now.AddMinutes(20));
cache.Insert(key, cacheItem);
}
catch (OperationFailedException ex)
{
// NCache specific exception
// Exception can occur due to:
// Connection Failures
// Operation Timeout
// Operation performed during state transfer
}
catch (Exception ex)
{
// Any generic exception like ArgumentNullException or ArgumentException
}
Recommendation: To ensure the operation is fail safe, it is recommended to handle any potential exceptions within your application, as explained in Handling Failures.
Add File Dependency on Multiple Files
You can also add file dependency to an item which is dependent on multiple files or folders. This way a single item can be dependent on multiple items using the Add or Insert method. For Java, items can be added with dependency on multiple files using the insert methhod.
The Add
method adds a new item in the cache whereas the Insert
method adds a new item with dependency and if the item already exists in the cache it overwrites its properties.
Important
Note that this API also specifies cache item priority for eviction as well as expiration, so the value for that parameter has been passed as Default
, as it is not discussed here.
Following example adds an item with key "1001" which is dependent on two files placed on the specified paths.
try
{
// Pre-condition: Cache is already connected
// Get product from database against given ProductID
Product product = FetchProductByProductID(1001);
// Create a unique cache key for this product
String key = "Product:" + product.ProductID;
// Create a new CacheItem product
CacheItem cacheItem = new CacheItem(product);
// Specify the filepaths of the master files
// Make sure that the network file paths are accessible by NCache Service
string[] fileNames = new string[1];
fileNames[0] = "\\fileserver1\\ProductList.csv";
fileNames[1] = "\\fileserver1\\OrderList.csv";
//Adding cache item "Product:1001" with FileDependency on a list of files
cacheItem.Dependency = new FileDependency(fileNames);
cache.Insert(key, cacheItem);
// For successful addition of item with dependency
// Update or remove the file
// Verify if key is present using:
// cache.Contains()
// cache.Count
}
catch (OperationFailedException ex)
{
// NCache specific exception
// Exception can occur due to:
// Connection Failures
// Operation Timeout
// Operation performed during state transfer
}
catch (Exception ex)
{
// Any generic exception like ArgumentNullException or ArgumentException
}
Recommendation: To ensure the operation is fail safe, it is recommended to handle any potential exceptions within your application, as explained in Handling Failures.
Add File Dependency to Existing Cache Items
NCache also provides you with the ease of adding key dependency to an item already present in cache, without re-inserting it into the cache.
Important
This approach is comparatively less lightweight and more cost efficient since items are already present in the cache.
Using UpdateAttributes() API
This is done through CacheItemAttribute class, which has the property of Dependency to be set against CacheItem
.
The attribute is then set against the existing key of the item, using the UpdateAttributes method of Cache
class.
The following example adds an item to cache without dependency, and then sets the file dependency for the item using UpdateAttributes
method. This requires no need to add the item again to the cache.
try
{
// Pre-condition: Cache is already connected
// Generate a unique key for the fileData
string key = "FileData";
// Get the content of the file as string
// Make sure that the item already exists in the cache
string FileData = cache.Get<string>(key);
// Specify the filepath
string filepath = "\\FileHost\\ProductList.csp";
// Create a file dependency where key is depenent on the file on specified path
var dependency = new FileDependency(filepath);
// Create a CacheItemAttribute for dependency
var attr = new CacheItemAttributes();
attr.Dependency = dependency;
// Set the attribute of dependency against key
cache.UpdateAttributes(key, attr);
// Monitor/Verify dependency through either:
// PerfMon Counters
// cache.Contains(key)
// cache.Count
}
catch (OperationFailedException ex)
{
// NCache specific exception
// Exception can occur due to:
// Connection Failures
// Operation Timeout
// Operation performed during state transfer
}
catch (Exception ex)
{
// Any generic exception like ArgumentNullException or ArgumentException
}
Recommendation: To ensure the operation is fail safe, it is recommended to handle any potential exceptions within your application, as explained in Handling Failures.
Additional Resources
NCache provides sample application for File Dependency at:
- GitHub
- Shipped with NCache: %NCHOME%\samples\dotnet\Dependencies\FileBasedDependency
See Also
Custom Dependency
Cache Data Dependency on Database
Data Dependency for Relationship in Cache