2017-10-11 44 views
-1

当我运行的重命名命令,我认为它确实是这样的,Redis中的重命名数据是否始终可用?

  1. 用于新数据的新名称
  2. 旧名称中删除参考
  3. 删除旧数据(这可能需要一些时间,如果它很大)

对于访问这些数据的客户,是否曾经有过这样的时间?

  1. 的关键不存在
  2. 的数据是不是在一个良好的状态
  3. Redis的挂访问

期间Redis的重命名命令期间执行了哪些措施?

回答

1

因为Redis具有单线程执行的命令,所以重命名将是原子的,所以对1和2的答案是否定的。只有当目标键已经指向一个需要删除的大型结构时(Redis会将其删除),“删除旧数据”才会被复制。原始数据对象不会被复制。只有指向它的哈希表条目可能会移动。由于在Redis中重新编程是渐进式的,所以这应该是固定的时间。

由于单线程命令执行,Redis将总是“挂起”慢速命令。因此,对于3,根据你在做什么,它总是可以的,但在这种情况下,只有在你做了明显大的隐式删除时。

编辑:自Redis 4.0起,您实际上可以指定配置选项lazyfree-lazy-server-del yes(默认为no),并且服务器实际上将对这种副作用删除进行异步删除。换句话说,而不是删除阻塞,对象将排队等候后台删除。这将有效地使RENAME恒定时间。见样本cfg:https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf

相关问题