Redis 数据结构、缓存与锁实践
此页的token比较释放只避免删除别人的租约;租约到期不保证旧持有者停止,不能作为通用分布式锁保证。Cache-aside允许并发旧值,现行原子性与缓存边界及完整限额CLI补充可运行验证。
从来源文档中剥离的技术说明。示例与约束沿用原文,使用前按实际环境核对。
数据结构选择
| 数据结构 | 适用场景 | 示例 |
|---|---|---|
| String | 简单值存储、计数器 | 用户信息、访问次数 |
| Hash | 对象存储 | 用户资料、商品信息 |
| List | 队列、消息列表 | 任务队列、消息流 |
| Set | 去重、交集并集 | 关注列表、共同好友 |
| Sorted Set | 排行榜、范围查询 | 积分排名、热门榜单 |
| Hash | 结构化数据 | 配置信息、对象属性 |
分布式锁
锁的实现
SET lock:resource:id random_value NX PX 30000- NX: 仅当键不存在时设置
- PX: 设置过期时间(毫秒)
- random_value: 唯一标识,用于安全释放
锁的释放
lua
if redis.call("get", KEYS[1]) == ARGV[1] then
return redis.call("del", KEYS[1])
else
return 0
end1. Cache-Aside(旁路缓存)
读操作:
1. 先查缓存
2. 缓存命中则返回
3. 缓存未命中则查数据库,写入缓存后返回
写操作:
1. 先写数据库
2. 再删除缓存(而非更新缓存)适用范围
延伸阅读
数据结构说明见 Redis 数据结构与应用场景,操作语法见 Redis 命令速查。
继续阅读
- 数据与原子性
- 数据与原子性
- 数据与原子性