删除为什么危险
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 之类的统计会先于实际回收变化,不要用一次采样判断删除是否生效。