Redis 7集群模式下rename大哈希键后源key未删除问题求助
RENAME大哈希键后源Key未删除的根因分析 集群槽位迁移的竞态问题
Redis集群里,如果RENAME执行期间,源Key所在槽位刚好触发迁移(比如集群扩容缩容、槽位重平衡),RENAME的原子性只在单节点内有效。跨槽位的RENAME实际是分三步:删目标Key、把源Key数据复制到目标槽位节点、再删源Key。要是迁移过程中源Key槽位被迁出,删除源Key的步骤可能没被正确执行,就留了下来。大Key操作中途中断
大哈希键的RENAME(尤其是跨槽位)要花不少时间复制数据。如果执行时节点发生主从切换、进程重启、网络闪断,复制完数据后删除源Key的步骤可能被打断。Redis7虽对大Key操作有优化,但极端情况还是可能出现这种只执行了一半的情况。Redis7特定版本的Bug
Redis7集群模式下的RENAME处理可能存在版本专属Bug,比如跨槽位大Key复制后的删除逻辑,没正确处理异常分支(比如复制时的内存不足、IO错误),导致源Key没被清理。建议核对当前Redis7的具体小版本,查官方更新日志有没有相关修复记录。客户端重试引发的重复执行
如果客户端执行RENAME时因网络延迟没收到响应,触发重试,可能多次执行命令。第一次执行完成了复制但没删源Key,第二次执行又复制一次,而删除源Key的步骤可能因为某些条件(比如源Key已被标记待删)被跳过,最后源Key就遗留了。内存不足导致删除失败
当节点内存快到上限时,删除大Key的操作可能因为内存分配问题(比如删哈希表需要临时空间)失败,但Redis没把错误返回给客户端。这时候源Key会被保留,目标Key却已经存在了。可以检查节点的内存使用日志、OOM相关记录。
内容的提问来源于stack exchange,提问作者tinycache

