Add/Update Data with Streams [Deprecated]
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 to the existing data against the specified key.
Prerequisites
Before using the NCache client-side APIs, ensure that the following prerequisites are fulfilled:
- Install the following NuGet packages in your .NET client application:
- Enterprise: Alachisoft.NCache.SDK
- OpenSource: Alachisoft.NCache.Opensource.SDK
- Include the following namespaces in your application:
- The cache must be running.
- Make sure that the data being added is serializable.
- 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.
try
{
// Precondition: Cache is already connected
// Generate a unique cache key
string key = "key:ncache-video";
// Set StreamMode object to Write
StreamMode streamMode = StreamMode.Write;
// Provide the streamMode in CacheStreamAttributes object
// CacheStreamAttributes contains properties such as 'Group', 'Expiration', etc
var streamAttributes = new CacheStreamAttributes(streamMode);
streamAttributes.Group = "ImageDataGroup";
// 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);
}
}
}
}
catch (OperationFailedException ex)
{
// Exception can occur due to:
// Connection Failures
// Operation Timeout
// Operation performed during state transfer
}
catch (Exception ex)
{
// handle exception
// This includes StreamException
}
Note
To ensure the operation is fail-safe, it is recommended to handle any potential exceptions within your application, as explained in Handling Failures.
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.
// Precondition: Cache is already connected
// Generate a unique cache key
string key = "key:ncache-video";
// 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 Stream Processing on GitHub.
See Also
.NET: Alachisoft.NCache.Client namespace.
Java: com.alachisoft.ncache.client namespace.