930 字
5 分钟
Redis 通常应用于哪些场景?
  1. 1Redis 系列导读:知识地图、必会主线与复习顺序
  2. 2Redis 中常见的数据类型有哪些?
  3. 3Redis 通常应用于哪些场景?本文
  4. 4Redis为什么这么快?
  5. 5Redis 常用的过期时间、删除 Key 命令有哪些?
  6. 6Redis 的过期 Key 是如何被删除的?
  7. 7Redis 内存满了怎么办?有哪些淘汰策略?
  8. 8缓存穿透、击穿、雪崩的区别与解决方案
  9. 9Redis 如何保证缓存与数据库的数据一致性?
  10. 10Redis 的持久化机制有哪些?
  11. 11Redis 主从复制的完整流程是什么?
  12. 12Redis 的哨兵机制是什么?
  13. 13Redis Cluster 模式与 Sentinel 模式的区别是什么?
  14. 14Redis 支持事务吗?如何实现?
  15. 15Redis 中如何实现分布式锁?
  16. 16Redis 的 Lua 脚本功能是什么?如何使用?
  17. 17如何解决 Redis 中的热点 Key 问题?
  18. 18Redis BigKey 有什么危害?如何发现和治理?
  19. 19为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
  20. 20Redis 的 LRU 和 LFU 有什么区别?
  21. 21Redis 数据类型和底层编码有什么区别?
  22. 22Redis 中跳表的实现原理是什么?
  23. 23Redis 的 ZSet 为什么使用跳表,而不是平衡树?
  24. 24Redis 的 RDB 快照如何生成?为什么会有写时复制?
  25. 25Redis 的 AOF 刷盘和重写有什么区别?
  26. 26Redis 断线后如何通过 PSYNC 部分重同步?
  27. 27Redis 主从切换为什么会丢数据?WAIT 能解决吗?
  28. 28Redis 集群会出现脑裂问题吗?
  29. 29Redisson 看门狗(watch dog)机制了解吗?
  30. 30Redis Cluster:哈希槽、Gossip 与故障转移
  31. 31Redis Pipeline 为什么能提高吞吐?能保证原子性吗?
  32. 32Redis 的 SCAN 和 KEYS 有什么区别?
  33. 33Redis 变慢时如何排查?SLOWLOG 能看到所有耗时吗?
  34. 34Redis 和 MySQL 有什么区别?
  35. 35Redis 为什么使用 SDS,而不是 C 字符串?
  36. 36Redis 的哈希表如何处理冲突和渐进式 rehash?
  37. 37Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
  38. 38Redis Cluster 为什么会报 CROSSSLOT?Hash Tag 怎么用?
  39. 39Redis 如何实现限流?固定窗口和滑动窗口怎么选?
  40. 40Redis Stream 如何保证消息消费?ACK 和 PEL 是什么?
  41. 41Redis 删除数据后为什么内存不下降?如何理解内存碎片?

Redis 在项目中主要有两个作用:一是作为缓存提升系统性能,二是用于分布式协调、计数、限流等场景。

具体来说,主要有以下五个应用场景。

1)第一,最核心的场景是缓存。

MySQL 的数据主要存储在磁盘上,而 Redis 基于内存存储,读写延迟更低、性能更高。

在实际项目中,我们通常使用 String 或 Hash 类型缓存用户信息、商品详情、Session 会话以及复杂的数据库查询结果。这样可以减少数据库访问次数,降低 MySQL 的查询压力,提高系统的响应速度。

例如,用户访问热门商品详情页时,可以优先查询 Redis 缓存,只有缓存未命中时才查询 MySQL,再将查询结果写入缓存。

1

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 高性能、原子操作和丰富数据结构的优势。

Redis 通常应用于哪些场景?
https://blog.xqcherry.top/posts/interview/redis/redis-use-cases/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0