首页/数据/Redis 进阶速查/大 key 的安全删除
性能与排障129 条

大 key 的安全删除

删除大集合用 UNLINK 或分批删除(HSCAN+SHDEL 等),避免 DEL 同步释放造成长时间阻塞;删除前确认数据可弃。

Redis 进阶速查数据更新于 2026-10-13

删除为什么危险

DEL 是同步删除:服务端要一次性遍历并释放集合里的所有元素,元素越多阻塞越久,几百万元素的 hash 或 zset 上可能造成秒级停顿。Redis 4.0 起提供 UNLINK,主线程只摘除键,内存释放交给后台线程异步完成;更细粒度的做法是分批删除,把一次大动作摊成多次小动作。

基本信息

同步删除DEL key
异步删除UNLINK key(Redis 4.0+)
分批删除HSCAN + HDEL 等组合
关联配置lazyfree-lazy-eviction / -lazy-expire / -lazy-server-del
前提删除不可逆,先确认数据可弃

典型使用场景

  • 业务下线后清理遗留的大集合
  • 误写入超大键需要紧急移除
  • 迁移或重建前清空源实例的大键
  • 压测结束后清理造出的数据
  • 定期回收长期无人访问的巨型 key

安全删除步骤

安全删除步骤
redis-cli MEMORY USAGE big:hash         # 先量化规模,判断删除是否安全
redis-cli HLEN big:hash                 # 元素数量级决定用哪种删法
redis-cli UNLINK big:hash               # 首选:异步释放,主线程只摘键
redis-cli HSCAN big:hash 0 COUNT 500    # 超大键分批删除前,先探路看字段分布
# 分批方案:循环 HSCAN 取字段名,再用 HDEL 一批批删,注意循环退出条件
redis-cli EXISTS big:hash               # 删除后确认键已不存在
redis-cli INFO memory | grep -E 'used_memory'   # 观察内存是否逐步回落

删除方式对照

方式机制适用与风险
DEL主线程同步释放全部元素小键可用;大键会造成明显停顿
UNLINK后台线程异步释放4.0+ 首选,摘键很快,回收滞后
HSCAN 加 HDEL脚本分批删除超大键控速删,需限速与退出条件
EXPIRE 加过期等过期机制触发删除配合 lazyfree-lazy-expire 才异步
FLUSHDB整库清空危险,误用会清掉整库数据
lazyfree 系列配置能把淘汰、过期、服务端隐式删除等路径的释放也转成异步;打开后内存回收节奏变慢,内存水位评估要相应留出余量。
UNLINK 与 DEL 都是不可逆操作。删除前确认数据是否还有用途、备份是否可用、备份中的恢复点是否已经过期。
后台异步释放期间,MEMORY USAGE 之类的统计会先于实际回收变化,不要用一次采样判断删除是否生效。

易错点

  • 对超大集合用 DEL:主线程阻塞期间所有请求排队,表现为整体超时,应先 UNLINK
  • 分批删除脚本无限速:HSCAN 与删除本身都消耗 CPU,删得越快越可能拖慢在线业务
  • 不确认用途就删:误删只能靠备份恢复,且备份可能已经滚掉
  • 开了 lazyfree 后按旧经验估内存水位:回收速率下降,实际更容易触顶

数据来源与参考

  • Redis 官方文档:大键删除建议
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌