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

时间:2012-06-07 13:50:54

标签: .net redis servicestack

使用ServiceStack,有没有办法执行多个读命令(特别是ContainsKey命令)?

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

我知道我可以向redis请求对象然后从数据库中获取它是否返回null,但是存储的对象相当大,所以我宁愿只获取一个bool列表然后确定哪个用于在数据库中查询的ID。

暂时我正在遍历我的ID列表(最多可以达到100个)并在servicestack中使用ContainsKey方法。我希望避免所有来回,并一次性完成所有请求。

1 个答案:

答案 0 :(得分:3)

ServiceStack.Redis客户端上,您可以使用GetValuesGetValuesMap(字符串和T apis都可用)在一次调用中获取多个值(使用MGET) 。仅返回现有项目,如果您的模型上有 Id ,或GetValues返回现有密钥及其值的字典,则可以使用GetValuesMap检测到这些项目。 / p>

通过此,您可以确定并从数据库中获取所有丢失的ID。如果您只是想从Redis中获取现有值,那么这是最佳策略,因为您可以获取所有值并通过1次调用确定现有键。

替代'单一呼叫'选项

使用流水线或交易

如果由于某种原因你真的只想检查Redis中是否存在密钥而不提取它们,那么你可以使用Transaction /或Pipeline(都是流水线)来排队多个操作,这些操作将被发送到1个socket中的Redis写。以下是来自RedisStackOverflow演示的示例,该演示将gets send and executed in a single batch的30个操作排队。

使用LUA脚本

如果你有Redis> v2.5x,你可以使用Redis's server-side LUA support创建和执行复合操作。您可以使用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);