Redis 在项目中主要有两个作用:一是作为缓存提升系统性能,二是用于分布式协调、计数、限流等场景。
具体来说,主要有以下五个应用场景。
1)第一,最核心的场景是缓存。
MySQL 的数据主要存储在磁盘上,而 Redis 基于内存存储,读写延迟更低、性能更高。
在实际项目中,我们通常使用 String 或 Hash 类型缓存用户信息、商品详情、Session 会话以及复杂的数据库查询结果。这样可以减少数据库访问次数,降低 MySQL 的查询压力,提高系统的响应速度。
例如,用户访问热门商品详情页时,可以优先查询 Redis 缓存,只有缓存未命中时才查询 MySQL,再将查询结果写入缓存。

2)第二,利用 Redis 实现分布式锁。
在微服务集群中,Java 的 synchronized 只能协调同一个 JVM 内的线程,无法直接协调不同服务器上的线程。
这时可以利用 Redis 的 SET NX 等机制实现分布式锁,也可以使用 Redisson 框架简化实现。
Redis 能够保证单条命令的原子性,因此多个服务实例竞争同一把锁时,只有成功获取锁的实例才能执行临界区代码。实际使用时,还需要考虑锁的过期时间、唯一标识和安全释放等问题。
分布式锁常用于防止重复执行任务、控制并发操作等场景。不过,防止商品超卖还需要结合数据库条件更新等措施,不能仅依赖分布式锁。
3)第三,利用 String 等数据结构实现计数器和限流。
第一是实现计数器。比如文章阅读量、点赞数,可以使用 Redis 的 INCR 命令进行原子递增,减少频繁更新 MySQL 的次数,降低数据库压力。
第二是实现接口限流。比如限制一个用户每分钟最多请求 100 次,可以使用 Redis 记录请求次数,结合过期时间和 Lua 脚本实现原子计数与限流判断。超过限制就拒绝请求,从而防止系统过载。
4)第四,利用 ZSet 实现排行榜。
Redis 的 ZSet,也就是有序集合,会根据每个成员的分数维护有序关系。
例如直播间贡献榜、游戏战力榜、商品热度榜等,都可以使用 ZADD 更新成员分数,再通过 ZREVRANGE 等命令查询排名靠前的成员。
相比于每次都在数据库中执行复杂的排序查询,Redis 更适合需要频繁更新分数和实时查询排名的业务。
5)第五,利用 List 或 Stream 实现轻量级消息队列。
如果项目只需要简单的异步任务处理,可以使用 Redis List,例如通过 LPUSH 和 RPOP 实现简单的任务队列。
如果需要更完善的消息消费机制,可以考虑 Redis Streams,它支持消费者组、消息确认等功能。
不过,如果业务对消息持久化、可靠投递、重试机制等有较高要求,也可以根据需求选择 RabbitMQ、Kafka 等专业消息中间件。
总结一下: Redis 最核心的应用是缓存,主要用于提升系统性能、减轻数据库压力;此外,还可以利用 SET NX 实现分布式锁,利用 INCR 实现计数与限流,利用 ZSet 实现排行榜,以及利用 List、Stream 实现消息队列。这些场景主要发挥了 Redis 高性能、原子操作和丰富数据结构的优势。