一尘不染

如何使用ServiceStack将多个读取命令传递给Redis

redis

使用ServiceStack,是否可以执行多个读取命令(特别是ContainsKey命令)?

存储的对象需要一段时间才能从数据库中获取,因此我们希望仅获取那些不在缓存中的对象。

我知道我可以向redis请求该对象,然后从数据库中获取是否返回null,但是存储的对象相当大,所以我宁愿只获取布尔列表,然后确定要查询的id在数据库中。

目前,我正在遍历我的Ids列表(最多100个左右),并在servicestack中使用ContainsKey方法。我希望避免所有的来回回合,并一口气提出所有要求。


阅读 578

收藏
2020-06-20

共1个答案

一尘不染

ServiceStack.Redis客户端上,您可以使用GetValuesGetValuesMap(字符串和T
api都可用)在单个调用中获取多个值(使用MGET)。仅返回现有项,GetValues如果您的模型上有
Id,GetValuesMap返回现有键及其值的字典,您可以通过它们进行检测。

由此,您可以确定并从数据库中获取所有缺少的ID。如果您无论如何要从Redis获取现有值,那么这是最佳策略,因为您可以通过一次调用获取所有值并确定现有键。

替代的“单次通话”选项

使用管道或事务

如果出于某种原因您真的只想检查Redis中密钥的存在而不获取它们,那么您可以使用Transaction
/或Pipeline(均已管道化)来排队多个操作,这些操作在1个套接字写入中发送给Redis。这是RedisStackOverflow演示中的一个示例,该示例排队30个操作,这些操作将在单个批处理中发送和执行。

使用LUA脚本

如果Redis>
v2.5x,则可以使用Redis的服务器端LUA支持来创建和执行复合操作。您可以从ServiceStack.Redis客户端中的IRedisClient使用以下API
来执行服务器端LUA脚本:

string GetEvalStr(string body, int numOfArgs, params string[] args);
int GetEvalInt(string body, int numOfArgs, params string[] args);
List<string> GetEvalMultiData(string body, int numOfArgs, params string[] args);
2020-06-20