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 使用。

方式有三种:

  1. List
1
2
LPUSH queue msg
BRPOP queue

生产者 push,消费者 pop。

  1. Pub/Sub(发布订阅)

Redis 自带的发布订阅机制:

1
2
PUBLISH channel message
SUBSCRIBE channel

特点是 实时广播,但不保存消息

  1. Stream(Redis 5 之后)

Stream 更接近真正的消息队列:

  • 消息持久化
  • 消费者组
  • ACK机制

适合日志流、任务队列等场景。


第三类:分布式限流

在高并发系统里,限流是常见需求。

Redis 可以用 计数器 + 过期时间 实现:

例如限制一个用户每分钟 100 次请求。

1
2
INCR user:123:req
EXPIRE user:123:req 60

如果计数 >100 就拒绝。

进一步还可以实现:

  • 滑动窗口限流
  • 漏桶算法
  • 令牌桶算法

很多 API 网关限流方案就是这么做的。


第四类:排行榜

Redis 的 Sorted Set (ZSet) 是一个非常优雅的数据结构。

它内部是:

  • 跳表 (Skip List) + Hash

可以高效支持:

  • 按 score 排序
  • 获取前 N 名

例如游戏排行榜:

1
2
ZADD rank 100 playerA
ZADD rank 90 playerB

查询:

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
2
用户是否签到
用户是否活跃

例如:

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的原子操作控制多个服务实例对共享资源的并发访问。
第二,可以用ListStream实现消息队列,用于异步任务处理或者系统解耦。
第三,可以利用Sorted Set实现排行榜,例如游戏积分榜或者热度榜。
第四,还可以利用INCR等原子操作实现分布式限流或计数器,比如限制接口的访问频率。

所以总体来说,Redis 不只是一个缓存工具,在很多系统中也被当作一个高性能的数据结构服务来使用。