如何通过在redis

时间:2016-10-23 14:53:18

标签: hash redis

redis的哈希队列中有一些值,程序需要保持该队列只有3个成员。

例如:

127.0.0.1:6379> HSET hash2 user1 "name1"

127.0.0.1:6379> HSET hash2 user2 "name2"

127.0.0.1:6379> HSET hash2 user3 "name3"

当插入新密钥" user4"时,程序中的队列应该删除" user1"来自hash2。

我们知道该列表有一个" ltrim"函数可以轻松地将列表保存在固定计数中。

至于哈希,我找不到一个容易做到的功能。 如果hash2的计数小于512,则redis将键存储在" ziplist"数据结构。它的行为就像序列列表一样。 有没有办法将哈希队列保持在固定数量,当插入该队列的新值时,应该删除最早进入队列的密钥?

到目前为止,我可以通过以下方式将新值插入哈希队列:

  1. 读取hash2的长度

  2. 如果长度小于3,则直接插入队列,否则执行步骤3.

  3. 如果长度大于3,**从redis中读取所有键**

  4. 删除第一个

  5. 将新的vlaue插入哈希队列。

1 个答案:

答案 0 :(得分:3)

HASH中的元素没有订单,您无法分辨哪一个是最旧的/最新的。因此ltrim没有类似于HASH的命令。

您的解决方案可以正常工作的原因是Redis将小哈希编码为 zipmap 。正如您所提到的, zipmap LIST类似,元素按插入时排序。但是,依靠它并不是一个好主意。如果有人更改了hash-max-zipmap-entrieshash-max-zipmap-value的配置,或者您HASH的数量超出了限制,那么您的解决方案可能会失败。

<强>解决方案

  

使用额外的LIST记录订单

您可以使用额外的LIST来记录元素/字段的顺序,而不是依靠 zipmap 的顺序。每次在HASH中插入元素时,rpush字段都会LISTHASH。如果lpop的大小达到限制,LIST HASH中的第一个元素,则删除HSET hash2 user1 "name1" RPUSH list2 user1 HSET hash2 user2 "name2" RPUSH list2 user2 HSET hash2 user3 "name3" RPUSH list2 user3 HSET hash2 user4 "name4" // reach the limit LPOP list2 // remove the oldest from list to get "user1" HDEL hash2 user1 // remove it from hash 中的相应字段。

painter.translate()