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"数据结构。它的行为就像序列列表一样。 有没有办法将哈希队列保持在固定数量,当插入该队列的新值时,应该删除最早进入队列的密钥?
到目前为止,我可以通过以下方式将新值插入哈希队列:
读取hash2的长度
如果长度小于3,则直接插入队列,否则执行步骤3.
如果长度大于3,**从redis中读取所有键**
删除第一个
将新的vlaue插入哈希队列。
答案 0 :(得分:3)
HASH
中的元素没有订单,您无法分辨哪一个是最旧的/最新的。因此ltrim
没有类似于HASH
的命令。
您的解决方案可以正常工作的原因是Redis将小哈希编码为 zipmap 。正如您所提到的, zipmap 与LIST
类似,元素按插入时排序。但是,依靠它并不是一个好主意。如果有人更改了hash-max-zipmap-entries
和hash-max-zipmap-value
的配置,或者您HASH
的数量超出了限制,那么您的解决方案可能会失败。
<强>解决方案强>
使用额外的LIST记录订单
您可以使用额外的LIST
来记录元素/字段的顺序,而不是依靠 zipmap 的顺序。每次在HASH
中插入元素时,rpush
字段都会LIST
。HASH
。如果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()