Memcached删除与更新命令 #
一、删除命令 #
1.1 delete命令 #
text
delete命令:
- 删除指定键的数据
- 键不存在时返回NOT_FOUND
语法:
delete <key> [noreply]\r\n
响应:
DELETED - 删除成功
NOT_FOUND - 键不存在
1.2 基本使用 #
bash
# 存储数据
set user:1001 0 3600 45
{"id":1001,"name":"John","email":"john@example.com"}
STORED
# 删除数据
delete user:1001
DELETED
# 删除不存在的数据
delete user:9999
NOT_FOUND
1.3 使用noreply #
bash
# 不等待响应
delete user:1001 noreply
# 适用于批量删除
delete user:1001 noreply
delete user:1002 noreply
delete user:1003 noreply
1.4 应用场景 #
bash
# 1. 用户注销时删除Session
delete session:abc123
DELETED
# 2. 释放分布式锁
delete lock:resource:1001
DELETED
# 3. 清除缓存
delete cache:product:2001
DELETED
# 4. 删除过期数据
delete temp:code:xyz789
DELETED
二、touch命令 #
2.1 命令说明 #
text
touch命令:
- 更新键的过期时间
- 不修改数据内容
- 键不存在时返回NOT_FOUND
语法:
touch <key> <exptime> [noreply]\r\n
响应:
TOUCHED - 更新成功
NOT_FOUND - 键不存在
2.2 基本使用 #
bash
# 存储数据
set session:abc123 0 1800 64
{"user_id":1001,"login_time":1704067200}
STORED
# 更新过期时间(延长到1小时)
touch session:abc123 3600
TOUCHED
# 更新不存在的键
touch notexist 3600
NOT_FOUND
2.3 应用场景 #
bash
# 1. 延长Session有效期
touch session:abc123 1800
TOUCHED
# 2. 刷新缓存过期时间
touch cache:product:2001 3600
TOUCHED
# 3. 提前过期数据
touch temp:data 1
TOUCHED
# 4. 永不过期
touch config:app 0
TOUCHED
三、cas命令更新 #
3.1 命令说明 #
text
cas命令(Compare And Swap):
- 检查并更新数据
- 需要提供CAS ID
- 实现乐观锁
语法:
cas <key> <flags> <exptime> <bytes> <cas unique> [noreply]\r\n
<data block>\r\n
响应:
STORED - 更新成功
EXISTS - CAS ID不匹配
NOT_FOUND - 键不存在
3.2 基本使用 #
bash
# 获取数据和CAS ID
gets user:1001
VALUE user:1001 0 45 123
{"id":1001,"name":"John","email":"john@example.com"}
END
# 使用CAS更新
cas user:1001 0 3600 45 123
{"id":1001,"name":"John","email":"john@example.com","age":25}
STORED
# CAS ID不匹配
cas user:1001 0 3600 45 122
{"id":1001,"name":"John","age":26}
EXISTS
3.3 实现安全更新 #
bash
# 场景:更新商品库存
# 1. 获取当前库存
gets product:1001:stock
VALUE product:1001:stock 0 2 100
50
END
# 2. 计算新库存(客户端)
new_stock = 50 - 1 # 减1
# 3. 使用CAS更新
cas product:1001:stock 0 3600 2 100
49
STORED
# 4. 如果失败,重试
gets product:1001:stock
VALUE product:1001:stock 0 2 101
49
END
cas product:1001:stock 0 3600 2 101
48
STORED
3.4 并发更新示例 #
bash
# 客户端A和客户端B同时更新
# 客户端A获取数据
gets counter
VALUE counter 0 1 10
5
END
# 客户端B获取数据
gets counter
VALUE counter 0 1 10
5
END
# 客户端A更新成功
cas counter 0 3600 1 10
6
STORED
# 客户端B更新失败(CAS ID已变)
cas counter 0 3600 1 10
6
EXISTS
# 客户端B需要重新获取
gets counter
VALUE counter 0 1 11
6
END
cas counter 0 3600 1 11
7
STORED
四、append/prepend更新 #
4.1 append追加 #
bash
# 存储初始数据
set log:app 0 0 20
2024-01-01 INFO: Start
STORED
# 追加日志
append log:app 0 0 25
\n2024-01-01 INFO: Running
STORED
# 查看结果
get log:app
VALUE log:app 0 45
2024-01-01 INFO: Start
2024-01-01 INFO: Running
END
4.2 prepend前置 #
bash
# 存储初始数据
set message 0 3600 5
world
STORED
# 添加前缀
prepend message 0 3600 6
Hello
STORED
# 查看结果
get message
VALUE message 0 11
Hello world
END
4.3 应用场景 #
bash
# 1. 日志追加
append log:error 0 0 30
\n2024-01-01 ERROR: Connection failed
# 2. 列表追加
set tags 0 3600 5
redis
STORED
append tags 0 3600 7
,mysql
STORED
append tags 0 3600 8
,mongodb
STORED
# 3. 消息队列
set queue:email 0 0 64
email1@example.com
STORED
append queue:email 0 0 65
\nemail2@example.com
STORED
五、批量删除 #
5.1 使用flush_all #
bash
# 清空所有数据
flush_all
OK
# 延迟清空(10秒后)
flush_all 10
OK
# 指定时间清空
flush_all 1704067200
OK
5.2 批量删除特定前缀 #
bash
# Memcached不支持批量删除特定前缀
# 需要客户端维护键列表
# 方案1:维护键集合
set keys:user 0 3600 50
user:1001,user:1002,user:1003
STORED
# 删除时遍历
get keys:user
VALUE keys:user 0 50
user:1001,user:1002,user:1003
END
delete user:1001
delete user:1002
delete user:1003
delete keys:user
5.3 使用命名空间 #
bash
# 方案:使用版本化的命名空间
# 版本1
set user:v1:1001 0 3600 45
{"id":1001,"name":"John"}
# 版本2(使版本1失效)
set user:v2:1001 0 3600 45
{"id":1001,"name":"John"}
# 客户端使用当前版本
current_version = "v2"
key = f"user:{current_version}:1001"
六、删除与更新策略 #
6.1 惰性删除 #
text
Memcached惰性删除机制:
1. 数据过期时不立即删除
2. 访问时检查是否过期
3. 过期则删除并返回不存在
4. 内存满时LRU淘汰
优点:
- 减少CPU开销
- 提高性能
缺点:
- 可能占用内存
- 依赖LRU清理
6.2 主动过期 #
bash
# 方案1:设置很短的过期时间
set temp:data 0 1 5
hello
# 方案2:使用touch提前过期
touch temp:data 1
# 方案3:直接删除
delete temp:data
6.3 更新策略 #
text
更新策略选择:
1. 简单覆盖
使用 set 命令
2. 条件更新
使用 replace 命令
3. 并发安全更新
使用 cas 命令
4. 追加更新
使用 append/prepend 命令
5. 延长过期
使用 touch 命令
七、实战案例 #
7.1 用户Session管理 #
bash
# 用户登录,创建Session
set session:abc123 0 1800 64
{"user_id":1001,"login_time":1704067200,"ip":"192.168.1.1"}
STORED
# 用户活跃,延长Session
touch session:abc123 1800
TOUCHED
# 用户注销,删除Session
delete session:abc123
DELETED
# 强制下线(管理员操作)
delete session:abc123
DELETED
7.2 商品库存管理 #
bash
# 初始化库存
set product:1001:stock 0 0 2
50
STORED
# 获取当前库存
gets product:1001:stock
VALUE product:1001:stock 0 2 100
50
END
# 扣减库存(使用CAS保证并发安全)
cas product:1001:stock 0 0 2 100
49
STORED
# 库存不足检查
gets product:1001:stock
VALUE product:1001:stock 0 2 101
0
END
# 不能扣减
cas product:1001:stock 0 0 2 101
-1
STORED # 需要客户端检查
7.3 分布式锁 #
bash
# 获取锁
add lock:resource:1001 0 30 1
1
STORED
# 执行业务逻辑...
# 释放锁
delete lock:resource:1001
DELETED
# 锁超时自动释放(30秒后)
# 锁已被占用
add lock:resource:1001 0 30 1
1
NOT_STORED
# 等待或重试
7.4 缓存更新 #
bash
# 场景:更新用户信息缓存
# 方案1:直接覆盖
set user:1001 0 3600 55
{"id":1001,"name":"John","email":"john@example.com","age":25}
STORED
# 方案2:CAS更新(防止覆盖其他更新)
gets user:1001
VALUE user:1001 0 45 123
{"id":1001,"name":"John","email":"john@example.com"}
END
cas user:1001 0 3600 55 123
{"id":1001,"name":"John","email":"john@example.com","age":25}
STORED
# 方案3:删除缓存,下次查询时重建
delete user:1001
DELETED
八、错误处理 #
8.1 常见错误 #
bash
# 1. 删除不存在的键
delete notexist
NOT_FOUND
# 2. CAS ID不匹配
cas key 0 0 5 999
hello
EXISTS
# 3. 键不存在
cas notexist 0 0 5 123
hello
NOT_FOUND
# 4. append/prepend键不存在
append notexist 0 0 5
hello
NOT_STORED
8.2 错误处理代码 #
python
def safe_delete(key):
result = client.delete(key)
if result:
return True
return False
def cas_update(key, update_func, max_retries=3):
for _ in range(max_retries):
# 获取数据和CAS ID
result = client.gets(key)
if result is None:
return False
value, cas = result
# 更新数据
new_value = update_func(value)
# CAS更新
if client.cas(key, new_value, cas):
return True
return False
九、性能优化 #
9.1 删除优化 #
text
删除优化建议:
1. 使用noreply
delete key noreply
2. 批量删除
使用flush_all或维护键列表
3. 延迟删除
flush_all 10
4. 避免频繁删除
使用过期时间自动清理
9.2 更新优化 #
text
更新优化建议:
1. 选择合适的更新命令
- 简单更新:set
- 条件更新:replace
- 并发更新:cas
- 追加更新:append/prepend
2. 减少更新频率
- 合并多次更新
- 使用批量操作
3. 使用CAS避免锁
- 乐观锁替代悲观锁
- 减少锁竞争
十、总结 #
删除与更新命令要点:
| 命令 | 说明 | 响应 |
|---|---|---|
| delete | 删除数据 | DELETED/NOT_FOUND |
| touch | 更新过期时间 | TOUCHED/NOT_FOUND |
| cas | 检查并更新 | STORED/EXISTS/NOT_FOUND |
| append | 追加数据 | STORED/NOT_STORED |
| prepend | 前置数据 | STORED/NOT_STORED |
最佳实践:
- 使用CAS实现并发安全更新
- 使用touch延长热点数据过期时间
- 合理使用noreply提高性能
- 处理好错误响应
下一步,让我们学习Memcached的计数器操作!
最后更新:2026-03-27