替换大型redis密钥的最有效方法

时间:2014-03-30 07:49:26

标签: redis sortedset

我有一个大的Redis排序集。我们需要每天重新索引集合中的数据,而客户主动请求集合中的数据。我的计划是使用不同的密钥构建第二个集合,然后用新的密钥替换现有的密钥:

  1. 建立新的"索引"排序集
  2. RENAME"已编入索引"设置为"直播"取代现有的" live"集。
  3. 查看RENAME文档,它指出:

      

    如果newkey已经存在,则会被覆盖,当发生这种情况时,RENAME会执行隐式DEL操作,因此如果删除的键包含非常大的值,即使RENAME本身通常是常量操作,也可能导致高延迟。

    我想知道,如果重新命名" live"排序集(例如,#34;死"),然后重命名新的"索引"排序设置为"直播" - 并管理这些请求。然后,只发出一个单独的DEL命令来删除" dead"设置:

    1. 建立新的"索引"排序集
    2. 管道:RENAME现有"直播"设置为"死"
    3. 管道:RENAME new"索引"设置为" live"
    4. DEL"死了"设置
    5. 想法?

1 个答案:

答案 0 :(得分:2)

使用DEL,您只是推迟了问题。在DEL期间,redis会阻止其他客户端。

首先,我要调查问题的严重程度。 可以成为问题,例如在我们的登台系统上删除3.5GB ZSET密钥大约需要2秒。

如果出现问题,请使用ZREMRANGEBYRANKDEL拆分ZCARD

流水线是有效的(非事务性的),因此有助于通过ZCARD预先确定总大小,然后发出N ZREMRANGEBYRANK个命令(管道),范围为(例如)-10000 0,以' 0 -1'结尾。删除所有成员后,Redis会自动删除密钥(排序集)本身。

希望这有帮助,TW