在我的应用程序中,我需要一组值,并且需要检查Redis 中的一组值中存在多少个值。
为了简单起见,我想做的是:
> Sadd myset field1
(integer) 1
> Sadd myset field2
(integer) 1
> Sadd myset field4
(integer) 1
> Sismember myset field1 field4 // which is not possible as of now.
由于我无法为 提供多个参数SISMEMBER,因此我可能必须多次调用 redis,这非常耗时。
我正在考虑类似的替代方案pipelining,但后来我认为这将是实现它的一个很好的(hacky)方式:
> Hset myhash field1 "true"
(integer) 0
> Hset myhash field2 "true"
(integer) 0
> Hset myhash field4 "true"
(integer) 1
> Hmget myhash field1 field2 field3
1) "true"
2) "true"
3) (nil)
> Hmget myhash field1 field2 field3 field4
1) "true"
2) "true"
3) (nil)
4) "true"
Redis HMGET页面内容如下:
自 2.0.0 起可用。
时间复杂度:O(N),其中 N 是请求的字段数。
与多次调用相比,这确实很好SADD,但我真的不确定我是否100%正确,而且我也不知道使用hmget这种方式是否有任何严重的缺点。
所以我只是想了解使用这种方式的缺点hmget以及任何更好的方法来解决这个问题。
这当然是一个有效的解决方案,尽管有点浪费,因为您将维护一堆true值 - RAM 开销。仅供参考,Redis 的集合是使用与哈希相同的哈希表结构在内部实现的,因此您的想法并不遥远:)
虽然没有可变参数形式SISMEMBER,但它是一个易于使用 Lua 编写脚本的流程,因此您可能也需要考虑这一点。例如如下所示:
local r = {}
for _, m in pairs(ARGV) do
  r[#r+1] = redis.call('SISMEMBER', KEYS[1], m)
end
return r
| 归档时间: | 
 | 
| 查看次数: | 3838 次 | 
| 最近记录: |