Hash 如何通过在redis中添加订单删除第一个键

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”函数,可以很容易地将列表保持在一个固定的计数中

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”函数,可以很容易地将列表保持在一个固定的计数中

至于散列,我找不到一个函数来轻松地实现这一点。 如果hash2的计数小于512,则redis通过“ziplist”数据结构存储密钥。它的行为就像一个序列列表。 有没有一种方法可以将散列队列保持在一个固定的数字中,当一个新值插入该队列时,应该删除队列中最早的密钥

现在,在将新值插入哈希队列时,我可以通过以下方式完成此操作:

  • 读取哈希2的长度

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

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

  • 删除第一个

  • 将新vlaue插入哈希队列


  • 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不是一个好主意。在我的工作中,我只是阅读别人写的数据。因此,列一个额外的清单并不方便。我将尝试更改列表中的哈希值。非常感谢。