我需要使用redis命令格朗。我使用它检索我存储的散列和字符串内容,以评估在内存缓存中使用side时是否更改了字符串内容。
使用(RedisClient.cs)无法访问get范围函数,因为它是不可用的
如何在使用RedisClient时使用GETRANGE命令
发布于 2022-04-29 05:17:36
用于GetRange()和SetRange()的UTF-8字符串APIs现已添加到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);
//...
}此更改可从v6.0.3 (即现在的可在MyGet上获得 )中获得。
发布于 2022-04-28 15:14:42
Update:从版本6.0.3 (ServiceStack.Redis)中,可以直接从RedisClient访问该特性。感谢神话的信息。
通过研究GitHub源代码,您可以看到RedisClient扩展了https://github.com/ServiceStack/ServiceStack.Redis/blob/b9a09632e0c5a9c46223854e8df9631595d77d6c/src/ServiceStack.Redis/RedisNativeClient.cs#L687,后者确实有可用的GetRange方法,因此第一个解决方案如下:
var nativeClient = redisClient as RedisNativeClient;
var prefix = nativeClient?.GetRange(key, from, to)?.FromUtf8Bytes();这个解决方案很好,很简单,而且可能永远都能工作,但是我们总是依赖ServiceStack来实现RedisClient扩展RedisNativeClient,但是我们不能100%肯定它。
另一种解决方案是利用LUA脚本执行特性,您可以:
var prefix = redisClient.ExecLuaAsString("return redis.call('GETRANGE', ARGV[1], ARGV[2], ARGV[3])", key, from, to);就性能而言,本机方法稍微快一些,并且使用的内存较少。

https://stackoverflow.com/questions/72046235
复制相似问题