首页/数据/数据库速查/DEL / UNLINK 删除键
Redis 命令96 条

DEL / UNLINK 删除键

DEL 同步删除并返回删除键数;UNLINK 异步回收内存(大 key 场景不阻塞主线程),删除效果相同但内存稍后释放。

数据库速查数据更新于 2026-10-13

DEL / UNLINK 是什么

DEL 同步删除键并返回真正删掉的键数量;UNLINK(Redis 4.0 起)做同样的删除,但把内存回收交给后台线程异步完成。对客户端而言两者都立即返回、键立刻不可见,区别在大 key 场景:DEL 会在主线程回收整块内存造成阻塞,UNLINK 把这一步挪到后台。

基本信息

适用版本DEL 全版本;UNLINK 需 Redis 4.0+
语法DEL key [key ...] / UNLINK key [key ...]
返回值实际删除的键数量,不存在的键不计入
耗时特征DEL 随元素数增长;UNLINK 立即入队返回
相关命令EXISTS / TYPE / MEMORY USAGE / SCAN

典型使用场景

  • 清理业务键:按前缀定位后批量删除,DEL 支持一次带多个键
  • 运维回收大 key:几十 MB 的 Hash/ZSet 用 UNLINK 避免主线程卡顿
  • 缓存失效:写库后删缓存,即 Cache Aside 的删除动作
  • 幂等判断:用返回值确认键此前是否存在,做一次性消费
  • 集群分片清理:按槽或前缀分批扫描后再删,避免单条命令过大
  • 排查残留键:删除后确认返回值,区分真删掉与本来就不存在
  • 下线业务回收:确认流量已停后再批量清理,避免误删仍在使用的键

示例

示例
SET k1 v1
SET k2 v2
DEL k1 k2                   # 返回 2
DEL k1                      # 返回 0,键已不存在
# 大 key 场景改用 UNLINK
UNLINK big:sorted:set       # 立即返回 1,内存由后台线程回收
MEMORY USAGE big:sorted:set # 返回 nil,键已不可见(内存未立刻归还)
SCAN 0 MATCH 'cache:user:*' COUNT 100   # 用游标分批找键,禁止线上 KEYS

删除方式对照

方式回收时机阻塞风险
DEL主线程同步释放内存大 key 会阻塞数百毫秒到数秒
UNLINK后台线程异步释放几乎不阻塞,内存稍后归还
过期删除惰性加定期两种触发视键大小同样可能造成毛刺
FLUSHDB整库一次清空生产环境高危,需二次确认
大 key(几十 MB 的 Hash/ZSet)用 DEL 会卡主线程;线上清理一律用 UNLINK,或按字段做 HDEL/ZREM 渐进式删除。
UNLINK 返回成功只说明键逻辑上已删,内存由后台释放;INFO memory 里的 used_memory 下降有延迟,做容量评估时要留出缓冲。

易错点

  • 用 DEL 删几百万元素的集合,主线程阻塞导致所有请求超时
  • 用 KEYS 找待删键:全库扫描会阻塞实例,必须换 SCAN 游标分批
  • DEL 返回 0 就以为删除失败:实际是键本来不存在,日志里要区分这两种情况
  • 一次塞上千个键进 DEL:单命令耗时过长同样卡主线程,应分批执行
  • 集群模式下把不同槽的键放进同一条 DEL,跨槽直接报错

数据来源与参考

  • Redis 官方文档: DEL
  • Redis 官方文档: UNLINK

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌