Hash 如何通过在redis中添加订单删除第一个键
redis的哈希队列中有一些值,程序需要保持该队列只有3个成员 例如:Hash 如何通过在redis中添加订单删除第一个键,hash,redis,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”时,程序中的队列应该从hash2中删除“user1” 我们知道列表有一个“ltrim”函数,可以很容易地将列表保持在一个固定的计数中
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”时,程序中的队列应该从hash2中删除“user1”
我们知道列表有一个“ltrim”函数,可以很容易地将列表保持在一个固定的计数中
至于散列,我找不到一个函数来轻松地实现这一点。
如果hash2的计数小于512,则redis通过“ziplist”数据结构存储密钥。它的行为就像一个序列列表。
有没有一种方法可以将散列队列保持在一个固定的数字中,当一个新值插入该队列时,应该删除队列中最早的密钥
现在,在将新值插入哈希队列时,我可以通过以下方式完成此操作:
HASH
中的元素没有顺序,您无法分辨哪个元素最早/最晚。因此,对于HASH
,没有类似于ltrim
的命令
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
您的解决方案可以工作的原因是Redis将小散列编码到zipmap中。正如您所提到的,zipmap类似于列表
,元素按插入时间排序。然而,依靠它不是一个好主意。如果有人更改了散列最大zipmap条目
和散列最大zipmap值
的配置,或者您的散列
的数量超过限制,则您的解决方案可能会失败
解决方案
使用额外列表记录订单
您可以使用额外的列表
记录元素/字段的顺序,而不必依赖zipmap的顺序。每次在HASH
中插入一个元素时,也要rpush
将该字段插入列表中。如果散列
的大小达到限制,lpop
将删除列表中的第一个元素
,并删除散列
中的相应字段
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
HASH
中的元素没有顺序,您无法分辨哪个元素最早/最晚。因此,对于HASH
,没有类似于ltrim
的命令
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
您的解决方案可以工作的原因是Redis将小散列编码到zipmap中。正如您所提到的,zipmap类似于列表
,元素按插入时间排序。然而,依靠它不是一个好主意。如果有人更改了散列最大zipmap条目
和散列最大zipmap值
的配置,或者您的散列
的数量超过限制,则您的解决方案可能会失败
解决方案
使用额外列表记录订单
您可以使用额外的列表
记录元素/字段的顺序,而不必依赖zipmap的顺序。每次在HASH
中插入一个元素时,也要rpush
将该字段插入列表中。如果散列
的大小达到限制,lpop
将删除列表中的第一个元素
,并删除散列
中的相应字段
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
抱歉,更新状态太晚。我同意你的观点,依赖zipmap不是一个好主意。在我的工作中,我只是阅读别人写的数据。因此,列一个额外的清单并不方便。我将尝试更改列表中的哈希值。非常感谢。很抱歉更新状态太晚。我同意你的观点,依赖zipmap不是一个好主意。在我的工作中,我只是阅读别人写的数据。因此,列一个额外的清单并不方便。我将尝试更改列表中的哈希值。非常感谢。