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。