通过哈希过滤列表

时间:2015-01-31 22:17:59

标签: redis

我想存储一个项目列表,过滤项目,然后按范围移动结果。

如何修改以下查询以仅返回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]

2 个答案:

答案 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在该域中提供了大量的功能。

如果您需要更多想法,请告诉我。