聊聊 Redis 使用场景
- 缓存
- 会话缓存
- 时效性
- 访问频率
- 计数器
- 社交列表
- 记录用户判定信息
- 交集、并集和差集
- 热门列表与排行榜
- 最新动态
- 消息队列
十一项场景清单覆盖了 Redis 的常见用法,但清单式罗列缺两块:每个场景对应哪种数据结构与命令组合(落地能力),以及哪些场景今天已有更优替代(边界认知)。本文把清单升级为”场景 → 结构 → 命令 → 注意事项”的四元组手册。
场景-结构-命令映射表
| 场景 | 结构 | 核心命令 | 注意 |
|---|---|---|---|
| 缓存(对象/页面) | String | SET/GET/SETEX | 过期策略+穿透/击穿/雪崩三防 |
| 会话缓存 | String/Hash | SET session:uid / HSET | 多节点共享会话;敏感信息脱敏存储 |
| 时效性(过期业务) | String TTL / Zset | EXPIRE/TTL、ZRANGEBYSCORE | 延迟队列用 Zset score=时间戳 |
| 访问频率限流 | String+TTL / Zset | INCR+EXPIRE、滑动窗口 ZADD+ZREMRANGEBYSCORE | 固定窗口有临界突刺,滑动窗口更平滑 |
| 计数器 | String | INCR/INCRBY(原子) | 点赞/浏览/库存预扣;持久化要求高需异步落库 |
| 社交列表(关注/粉丝) | Set | SADD/SREM/SISMEMBER | 亿级大 Set 注意内存与 bigkey |
| 共同好友/差异 | Set | SINTER/SDIFF/SUNION | 服务端集合运算免拉取客户端 |
| 排行榜 | Zset | ZADD/ZINCRBY/ZREVRANGE/ZREVRANK | score 复合(时间戳做次级序)技巧 |
| 最新动态(Feed) | List/Zset | LPUSH+LTRIM / ZADD 时间戳 | 推拉模式抉择:粉丝量分级推拉结合 |
| 消息队列 | List/Stream | LPUSH+BRPOP / XADD+XREADGROUP | 简单队列用 List;需消费组/ack/回溯用 Stream |
| 位图统计(签到/活跃) | Bitmap | SETBIT/BITCOUNT/BITOP | 亿级用户日活仅 12MB |
| UV 统计 | HyperLogLog | PFADD/PFCOUNT | 0.81% 误差换 12KB 固定内存 |
| 附近的人 | Geo | GEOADD/GEOSEARCH | 底层 Zset,半径/多边形查询 |
清单中三项的深入说明
时效性:两类用法——key 级 TTL(验证码 5 分钟、限流窗口)与 Zset 时间轴(延迟任务、过期事件轮询)。注意 TTL 只在 key 级;hash 内字段过期需拆 key 或 Zset 辅助。
记录用户判定信息(如”是否已点赞/已读”):Bitmap 按位存(user:liked:articleId 的 bit=uid)比 Set 存 uid 省两个数量级内存;判定位 GETBIT O(1)。
交集并集差集:Set 运算在服务端 O(较小集合) 完成;大集合 SINTER 会阻塞单线程——亿级集合交集应离线计算或分片预处理,别让 bigkey 运算跑在主线程(与 KEYS * 同类风险)。
边界:哪些场景今天有更优替代
- 消息队列:List 版无 ack/重试/消费组语义,生产级应上 Stream 或专业 MQ(Kafka/RocketMQ)——Redis 队列适合轻量内部任务
- 持久化要求高的计数/库存:Redis 异步持久化可能丢秒级数据,核心账目以 DB 为准、Redis 做前置缓冲与异步对账
- 全文检索:RediSearch 模块可用,但生态与能力不及 ES
- 大对象存储:Redis 内存贵,图片/文件走对象存储,Redis 只存元数据/URL
使用红线(场景成立的共同前提)
- 拒绝 bigkey(单 key >10MB 或元素 >10 万):删除阻塞、迁移卡顿、带宽尖刺
- 拒绝 hotkey 单点:本地缓存(Caffeine)+ 多副本分散
- 过期打散:批量 key 的 TTL 加随机抖动防雪崩
- 内存监控:maxmemory + 淘汰策略明确(缓存场景 allkeys-lru)
Redis 场景手册的正确用法:先按四元组表选结构与命令,再对照边界清单确认”这个场景是否该用 Redis”,最后过一遍红线检查——场景、结构、边界三层齐备,清单才从”知道”变成”会用”。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 非鱼小站!
评论
WalineDisqus











