Memcached delete 命令详解(2025 版)
delete 是 Memcached 的 删除命令 ,用于 主动失效缓存 ,防止“脏数据”长期存在。
场景:用户修改资料、订单状态变更、配置热更新、缓存清理
1. 基本语法
delete <key> [noreply]\r\n
参数 说明 <key>要删除的键名 [noreply]可选,异步删除(不等待响应)
响应 :
DELETED\r\n → 成功(key 存在)
NOT_FOUND\r\n → key 不存在
2. telnet 操作示例
telnet 127.0.0.1 11211
# 1. 写入数据
set user:1001 0 3600 8
zhangsan
STORED
# 2. 删除
delete user:1001
DELETED
# 3. 再次删除(已不存在)
delete user:1001
NOT_FOUND
# 4. 异步删除(高并发推荐)
delete log:temp 0 noreply
# 无响应,直接继续
3. 客户端使用 delete
Python(pymemcache)
from pymemcache.client.base import Client
client = Client(('127.0.0.1', 11211))
# 普通删除
client.delete('user:1001')
# 异步删除(高并发)
client.delete('log:event', noreply=True)
# 批量删除
client.delete_many(['user:1', 'user:2', 'config:tmp'])
PHP
$mc = new Memcached();
$mc->addServer('127.0.0.1', 11211);
// 删除
$mc->delete('user:1001');
// 异步
$mc->delete('log:batch', 0, true);
// 批量
$mc->deleteMulti(['user:1', 'user:2']);
Java(XMemcached)
client.delete("user:1001");
client.deleteWithNoReply("log:temp"); // 异步
4. delete vs 过期时间
方式 优点 缺点 delete立即生效 需主动调用 exptime自动清理 延迟失效 推荐 热点数据用 delete,冷数据用 exptime
5. 经典应用场景
场景 推荐做法 用户修改资料 delete user:{uid}订单状态变更 delete order:{id}:status配置热更新 delete config:db缓存清理 delete prefix:*(需遍历)防缓存穿透 delete 空值缓存
用户修改资料(Python)
def update_user(uid, new_data):
# 1. 更新数据库
db.update(uid, new_data)
# 2. 立即删除缓存
client.delete(f'user:{uid}')
# 下次 get 会重新回源
6. 批量删除(Memcached 原生无 delete *)
方案 1:遍历 key 删除(推荐)
# 假设用 Redis 存 key 列表,或用前缀
keys = [f'user:{i}' for i in range(1, 101)]
client.delete_many(keys)
方案 2:用 flush_all(慎用!)
flush_all
# 清空所有缓存
危险 :全量失效,引发 缓存雪崩
7. delete + CAS 安全删除
# 防止误删:先 gets 再 cas
result = client.gets('config:db')
if result:
value, cas = result
if value == 'old_config':
client.cas('config:db', 'new_config', cas)
else:
print("配置已变更,跳过")
8. 性能与监控
echo "stats" | nc 127.0.0.1 11211
指标 说明 cmd_delete删除次数 delete_hits成功删除 delete_misseskey 不存在
# 实时监控
watch -n 1 "echo 'stats' | nc 127.0.0.1 11211 | grep cmd_delete"
9. 最佳实践
建议 说明 修改即 delete 保持缓存一致性 热点 key 优先 delete 避免脏读 冷数据靠 exptime 自动清理 异步 noreply 高并发删除 避免 flush_all 除非维护
安全 flush_all
# 仅在维护窗口执行
echo "flush_all" | nc 127.0.0.1 11211
10. 常见问题
问题 原因 解决 NOT_FOUNDkey 已过期或不存在 正常,无需处理 缓存未失效 忘记 delete 检查业务逻辑 雪崩 大量 delete + flush_all 错峰失效、预热
11. 小结:delete 命令速查
delete key [noreply]
└─> DELETED
└─> NOT_FOUND
项目 推荐 用途 主动失效 配合 set / CAS异步 noreply=True批量 delete_many
练习建议
用 telnet 实现 用户修改 → 缓存失效
用 Python 实现 订单状态变更 → delete 缓存
实现 配置中心热更新 :修改配置 → delete → 下次 get 加载新值
写一个 缓存清理脚本 (按前缀删除)
需要 flush_all 清理、incr/decr 计数器、touch 延长过期?继续问我!