Stream Processing: Add/Update Cache Data
In Stream Processing, the GetCacheStream method is used to open a stream. It returns the handle of the opened stream as an instance of CacheStream class. To add or update data with streams, the streaming mode should be set to write mode. In write mode, multiple write operations can be performed on a stream opened with StreamMode.Write by one client.
While using Stream Processing, if the key provided with the GetCacheStream
API does not exist in the cache, the data written on the stream is added to the cache. If an item already exists in the cache with the provided key, binary data written on the stream is appended with the existing data against the specified key.
Stream Processing: Prerequisites to Add/Update Cache Data
- To learn about the standard prerequisites required to work with all NCache client-side features, please refer to the given page on Client-Side API Prerequisites.
- For API details, refer to: ICache, CacheStream, StreamMode, CacheStreamAttributes, GetCacheStream, Write.
Writing to a Stream
In write mode, multiple write operations can be performed on a stream with StreamMode.Write by one client.
// Precondition: Cache is already connected
// Generate a unique cache key
string key = "StreamKey";
// Set StreamMode object to Write
StreamMode streamMode = StreamMode.Write;
// Provide the streamMode in CacheStreamAttributes object
// CacheStreamAttributes is having properties like 'Group', 'Expiration' e.t.c
var streamAttributes = new CacheStreamAttributes(streamMode);
streamAttributes.Group = "VideoDataGroup";
// Open stream to read video file
using (var fileStream = File.OpenRead(@"..\\NCache Introduction.mp4"))
{
// Use GetCacheStream to initialize CacheStream object by setting streamAttributes against the specified key
using (var cacheStream = cache.GetCacheStream(key, streamAttributes))
{
// Create a byte array to read data in chunks of 4096 bytes
byte[] dataToWrite = new byte[4096];
long numBytesToRead = fileStream.Length;
while (numBytesToRead > 0)
{
// Read chunk of data
int bytesRead = fileStream.Read(dataToWrite, 0, dataToWrite.Length);
// Break when the end of the file is reached
if (bytesRead == 0)
break;
// Write stream data to cache
cacheStream.Write(dataToWrite, 0, bytesRead);
}
}
}
Using GetBufferedStream
In Stream Processing, a buffered stream is the set of bytes used for storing the data up to a certain limit before reading or writing it to the cache. The following code shows how to use GetBufferedStream:
// Generate a unique cache key
string key = "BufferedStreamKey";
// Set StreamMode object to Write mode
StreamMode streamMode = StreamMode.Write;
// Provide the streamMode in CacheStreamAttributes object
var streamAttributes = new CacheStreamAttributes(streamMode);
// Data will be written to cache once buffered data size reaches this limit
int bufferLength = 4096;
// Open stream to read video file
using (var fileStream = File.OpenRead(@"..\\NCache Introduction.mp4"))
{
// Initialize CacheStream object by setting streamAttributes against the specified key and Get Buffered stream
using (var cacheStream = cache.GetCacheStream(key, streamAttributes).GetBufferedStream(bufferLength))
{
// Create a byte array to read data
byte[] dataToWrite = new byte[1024];
long numBytesToRead = fileStream.Length;
while (numBytesToRead > 0)
{
// Read file in chunks of 1024 bytes
int bytesRead = fileStream.Read(dataToWrite, 0, dataToWrite.Length);
// Break when the end of the file is reached.
if (bytesRead == 0)
break;
// Write data to stream buffer.
// Buffered data will be written to cache once it reaches limit of 4096 bytes
cacheStream.Write(dataToWrite, 0, bytesRead);
}
}
}
Additional Resources
NCache provides sample application for Streaming on GitHub.
See Also
.NET: Alachisoft.NCache.Client namespace.
Java: com.alachisoft.ncache.client namespace.