2

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

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

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

目前我正在遍历我的 Id 列表(最多 100 个左右)并使用 servicestack 中的 ContainsKey 方法。我希望避免所有来回,并一次完成所有请求。

4

1 回答 1

3

ServiceStack.Redis客户端上,您可以使用GetValuesor (字符串和 T api 都可用)在一次调用中GetValuesMap获取多个值(使用MGET )。仅返回现有项目,GetValues如果您的模型上有IdGetValuesMap返回现有键及其值的字典,您可以检测这些项目。

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

替代“单一呼叫”选项

使用流水线或事务

如果出于某种原因您真的只想检查 Redis 中是否存在键而不获取它们,那么您可以使用事务/或管道(两者都是流水线的)来排队多个操作,这些操作在 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);
于 2012-06-07T18:03:29.567 回答