在Redis中,数据是否总是可以重命名?

在Redis中,数据是否总是可以重命名?,redis,Redis,当我运行rename命令时,我想它会这样做 为新数据使用新名称 删除旧名称的引用 删除旧数据(如果数据太大,可能需要一些时间) 对于访问此数据的客户端,是否曾经发生过这些情况 密钥不存在 数据状态不好 Redis在访问期间挂起 Redis重命名命令执行的步骤是什么?由于Redis具有单线程执行命令的功能,因此重命名将是原子性的,因此1和2的答案是否定的。只有当目标键已经指向需要删除的大型结构时,“删除旧数据”才是关键所在(Redis将关闭它)将不会复制原始数据对象。只能移动指向它的哈希表项。由于

当我运行rename命令时,我想它会这样做

  • 为新数据使用新名称
  • 删除旧名称的引用
  • 删除旧数据(如果数据太大,可能需要一些时间)
  • 对于访问此数据的客户端,是否曾经发生过这些情况

  • 密钥不存在
  • 数据状态不好
  • Redis在访问期间挂起

  • Redis重命名命令执行的步骤是什么?

    由于Redis具有单线程执行命令的功能,因此重命名将是原子性的,因此1和2的答案是否定的。只有当目标键已经指向需要删除的大型结构时,“删除旧数据”才是关键所在(Redis将关闭它)将不会复制原始数据对象。只能移动指向它的哈希表项。由于Redis中的重新灰化是增量的,因此本质上应该是恒定时间

    由于执行单线程命令,Redis将始终“挂起”较慢的命令。因此,对于3,它总是可以是肯定的,这取决于你在做什么,但在这种情况下,只有当你在做非常大的隐式删除时

    编辑:从Redis 4.0开始,您实际上可以指定配置选项
    lazyfree lazy server del yes
    (默认值为
    no
    ),服务器将实际异步删除此类副作用的删除。换句话说,对象将排队等待后台删除,而不是删除阻塞。这将有效地使
    重命名
    的时间恒定。参见示例cfg: