使用ServiceStack,是否可以执行多个读取命令(特别是ContainsKey命令)?
存储的对象需要一段时间才能从数据库中获取,因此我们希望仅获取那些不在缓存中的对象。
我知道我可以向redis请求该对象,然后从数据库中获取是否返回null,但是存储的对象相当大,所以我宁愿只获取布尔列表,然后确定要查询的id在数据库中。
目前,我正在遍历我的Ids列表(最多100个左右),并在servicestack中使用ContainsKey方法。我希望避免所有的来回回合,并一口气提出所有要求。
在ServiceStack.Redis客户端上,您可以使用GetValues或GetValuesMap(字符串和T api都可用)在单个调用中获取多个值(使用MGET)。仅返回现有项,GetValues如果您的模型上有 Id, 或GetValuesMap返回现有键及其值的字典,您可以通过它们进行检测。
GetValues
GetValuesMap
由此,您可以确定并从数据库中获取所有缺少的ID。如果您无论如何要从Redis获取现有值,那么这是最佳策略,因为您可以通过一次调用获取所有值并确定现有键。
如果出于某种原因您真的只想检查Redis中密钥的存在而不获取它们,那么您可以使用Transaction /或Pipeline(均已管道化)来排队多个操作,这些操作在1个套接字写入中发送给Redis。这是RedisStackOverflow演示中的一个示例,该示例排队30个操作,这些操作将在单个批处理中发送和执行。
如果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);