Redis应用
Redis应用
很多人一提到 Redis 就想到“缓存”。确实,缓存是它最常见的用途。但如果从系统设计角度看,它其实更像一个 高速数据结构服务器。因为 Redis 在内存中维护了丰富的数据结构(String、List、Set、ZSet、Hash、Bitmap、Stream 等),很多系统组件都可以直接建立在这些结构之上。
第一类:分布式锁
在分布式系统里,如果多个服务实例同时操作同一个资源,就需要锁来避免并发问题。
Redis 可以通过:
1 | SET lock_key value NX EX 10 |
实现一个原子操作:
NX:只在 key 不存在时设置EX:设置过期时间
这样就能实现一个 分布式锁。
典型应用:
- 秒杀系统防止超卖
- 防止重复提交
- 任务调度只允许一个实例执行
很多框架(比如 Redisson)都是基于 Redis 实现的。
第二类:消息队列
Redis 也可以当轻量级 MQ 使用。
方式有三种:
- List
1 | LPUSH queue msg |
生产者 push,消费者 pop。
- Pub/Sub(发布订阅)
Redis 自带的发布订阅机制:
1 | PUBLISH channel message |
特点是 实时广播,但不保存消息。
- Stream(Redis 5 之后)
Stream 更接近真正的消息队列:
- 消息持久化
- 消费者组
- ACK机制
适合日志流、任务队列等场景。
第三类:分布式限流
在高并发系统里,限流是常见需求。
Redis 可以用 计数器 + 过期时间 实现:
例如限制一个用户每分钟 100 次请求。
1 | INCR user:123:req |
如果计数 >100 就拒绝。
进一步还可以实现:
- 滑动窗口限流
- 漏桶算法
- 令牌桶算法
很多 API 网关限流方案就是这么做的。
第四类:排行榜
Redis 的 Sorted Set (ZSet) 是一个非常优雅的数据结构。
它内部是:
- 跳表 (Skip List) + Hash
可以高效支持:
- 按 score 排序
- 获取前 N 名
例如游戏排行榜:
1 | ZADD rank 100 playerA |
查询:
1 | ZREVRANGE rank 0 9 |
这种排行榜查询复杂度大约 O(logN),非常适合实时榜单。
第五类:会话存储(Session Store)
很多网站会把用户登录状态存在 Redis。
原因很简单:
- 访问速度快
- 可以共享给多个服务器
- 可以设置自动过期
例如:
1 | session:uid -> 用户信息 |
常见于:
- Spring Session
- 分布式 Web 系统
第六类:计数系统
Redis 的 INCR 是原子操作,非常适合做计数。
例如:
- 文章阅读量
- 视频播放量
- 点赞数
1 | INCR article:1001:view |
高并发下也不会出现计数错误。
第七类:实时统计(Bitmap / HyperLogLog)
Redis 提供了两个很有意思的数据结构。
Bitmap
可以记录用户行为:
1 | 用户是否签到 |
例如:
1 | SETBIT sign:20260310 uid 1 |
可以统计:
- 连续签到
- 活跃用户
HyperLogLog
用来统计 去重数量(UV),内存只需要 12KB。
适合统计:
- 日活 DAU
- 页面 UV
第八类:延迟队列
Redis 的 ZSet 还能实现延迟任务。
原理:
- score = 执行时间
- 定期扫描最小 score
例如:
1 | ZADD delay_queue 1710000000 order123 |
等时间到了再执行任务。
应用:
- 订单超时取消
- 定时通知
- 延迟任务
第九类:实时地理位置
Redis 有 GEO 数据结构。
例如:
1 | GEOADD location 116.4 39.9 user1 |
可以查询:
-
附近的人
-
附近的店
很多**LBS系统(Location Based Service)**就用这个。
总结
Redis除了做缓存之外,在实际项目中还有很多应用场景。因为 Redis 是一个基于内存的数据结构数据库,提供了丰富的数据结构和原子操作,所以在高并发系统中经常被用来实现一些基础组件。
比如第一,可以用Redis实现分布式锁,通过SET NX EX的原子操作控制多个服务实例对共享资源的并发访问。
第二,可以用List或Stream实现消息队列,用于异步任务处理或者系统解耦。
第三,可以利用Sorted Set实现排行榜,例如游戏积分榜或者热度榜。
第四,还可以利用INCR等原子操作实现分布式限流或计数器,比如限制接口的访问频率。
所以总体来说,Redis 不只是一个缓存工具,在很多系统中也被当作一个高性能的数据结构服务来使用。
