按哈希过滤列表
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 在该领域提供了强大的功能。
如果您需要更多想法,请告诉我。
我想存储项目列表,过滤项目,然后按范围浏览结果。
我如何将以下查询修改为仅 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 在该领域提供了强大的功能。
如果您需要更多想法,请告诉我。