Servicestack.Redis 如何使用 GetRange 功能
Servicestack.Redis how to use GetRange feature
我需要使用redis命令GETRANGE。
我用它来检索我存储的哈希值和字符串内容,以评估在内存缓存中使用 side 时后者是否已更改。
使用 (RedisClient.cs) 我无法访问获取范围函数,因为它不可用
如何在使用 RedisClient 时使用 GETRANGE 命令?
更新:从版本 6.0.3 (ServiceStack.Redis) 开始,可以直接从 RedisClient 访问该功能。
感谢 mythz 提供的信息。
探索GitHub源代码你可以看到RedisClient扩展了RedisClientNative,后者确实有GetRange方法可用,所以第一种解决方法如下:
var nativeClient = redisClient as RedisNativeClient;
var prefix = nativeClient?.GetRange(key, from, to)?.FromUtf8Bytes();
这个解决方案既好又简单,可能会一直有效,但我们依赖 ServiceStack 始终实现扩展 RedisNativeClient 的 RedisClient,但我们不能 100% 确定它。
另一种解决方案是利用 LUA 脚本执行功能,您可以:
var prefix = redisClient.ExecLuaAsString("return redis.call('GETRANGE', ARGV[1], ARGV[2], ARGV[3])", key, from, to);
在性能方面,本机方法稍微快一些,使用的内存更少。
GetRange()
和 SetRange()
的 UTF-8 字符串 API 现已添加到 IRedisClient
:
public interface IRedisClient
{
string Slice(string key, int fromIndex, int toIndex);
long InsertAt(string key, int offset, string value);
//...
}
和异步版本到:
public interface IRedisClientAsync
{
ValueTask<string> SliceAsync(string key, int fromIndex, int toIndex, CancellationToken token = default);
ValueTask<long> InsertAtAsync(string key, int offset, string value, CancellationToken token = default);
//...
}
此更改适用于现在 available on MyGet 的 v6.0.3。
我需要使用redis命令GETRANGE。 我用它来检索我存储的哈希值和字符串内容,以评估在内存缓存中使用 side 时后者是否已更改。
使用 (RedisClient.cs) 我无法访问获取范围函数,因为它不可用
如何在使用 RedisClient 时使用 GETRANGE 命令?
更新:从版本 6.0.3 (ServiceStack.Redis) 开始,可以直接从 RedisClient 访问该功能。 感谢 mythz 提供的信息。
探索GitHub源代码你可以看到RedisClient扩展了RedisClientNative,后者确实有GetRange方法可用,所以第一种解决方法如下:
var nativeClient = redisClient as RedisNativeClient;
var prefix = nativeClient?.GetRange(key, from, to)?.FromUtf8Bytes();
这个解决方案既好又简单,可能会一直有效,但我们依赖 ServiceStack 始终实现扩展 RedisNativeClient 的 RedisClient,但我们不能 100% 确定它。
另一种解决方案是利用 LUA 脚本执行功能,您可以:
var prefix = redisClient.ExecLuaAsString("return redis.call('GETRANGE', ARGV[1], ARGV[2], ARGV[3])", key, from, to);
在性能方面,本机方法稍微快一些,使用的内存更少。
GetRange()
和 SetRange()
的 UTF-8 字符串 API 现已添加到 IRedisClient
:
public interface IRedisClient
{
string Slice(string key, int fromIndex, int toIndex);
long InsertAt(string key, int offset, string value);
//...
}
和异步版本到:
public interface IRedisClientAsync
{
ValueTask<string> SliceAsync(string key, int fromIndex, int toIndex, CancellationToken token = default);
ValueTask<long> InsertAtAsync(string key, int offset, string value, CancellationToken token = default);
//...
}
此更改适用于现在 available on MyGet 的 v6.0.3。