我想存储一个项目列表,过滤项目,然后按范围移动结果。
如何修改以下查询以仅返回display = true?
的项目HSET item1 display true
HSET item2 display false
HSET item3 display true
LPUSH items item1
LPUSH items item2
LPUSH items item3
LRANGE items 0 3
-- returns [item3, item2, item1]
答案 0 :(得分:1)
Redis并没有办法从基于哈希值的列表中获取。但是你可以通过使用有序集来接近。而不是存储true / false,将true视为1,将false视为0.然后将元素添加到有序集合中。
zadd items 1 item1
zadd items 0 item2
zadd items 1 item3
现在获取display == 1(true)
的项目zrangebyscore items 1 1
它将返回[item1,item3]
答案 1 :(得分:1)
如果您只对表达布尔属性感兴趣,请使用常规集。使用SADD items:display item1 item3
添加项目并使用SMEMBERS
将其取回是微不足道的。
注1:您需要注意任何Redis命令的复杂性,特别是当您的N很大时(更多的成员,更长的列表......)。 SMEMBERS
可以运行很长时间,以防你的设置很大,所以你应该考虑使用更礼貌的SSCAN
变体。
注2:如果您还希望进行集合操作(例如,并集,交叉),则集合(和排序集合)非常有用。
注3:排序集是常规集(:)的超级集合,所以当然你可以使用它们获得相同的效果,但保持得分为0或1是一个有点浪费的IMO。
注4:您要探索的另一个可能方向是使用位图来存储布尔值 - Redis在该域中提供了大量的功能。
如果您需要更多想法,请告诉我。