Memcached delete 命令

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

练习建议

  1. 用 telnet 实现 用户修改 → 缓存失效
  2. 用 Python 实现 订单状态变更 → delete 缓存
  3. 实现 配置中心热更新:修改配置 → delete → 下次 get 加载新值
  4. 写一个 缓存清理脚本(按前缀删除)

需要 flush_all 清理、incr/decr 计数器、touch 延长过期?继续问我!

文章已创建 2481

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部