按哈希过滤列表

Filter a list by hash

我想存储项目列表,过滤项目,然后按范围浏览结果。

我如何将以下查询修改为仅 return 项 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]

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 

它将return [item1, item3]

如果您只对表达布尔属性感兴趣,只需使用常规集合即可。使用 SADD items:display item1 item3 添加项目,使用 SMEMBERS.

取回它们很简单

注意 1:您需要注意任何 Redis 命令的复杂性,尤其是当您的 N 很大时(更多的集合成员,更长的列表...)。 SMEMBERS 可以 运行 很长时间,以防你的集合很大,所以你应该考虑使用更礼貌的 SSCAN 变体。

注 2: 如果您还想进行集合操作(​​例如并集、相交),集合(和有序集)非常有用。

注 3: Sorted Sets 是常规 Sets (:)) 的超集,因此您当然可以使用它们来达到相同的效果,但保持分数为 0 或1 在我看来有点浪费。

注 4:您探索的另一个可能方向是使用位图存储布尔值 - Redis 在该领域提供了强大的功能。

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