思维导图
本文的思维导图如下:

一、认识 Redis
1. Redis 是什么?
Redis 是一个开源的、基于内存 的数据结构存储系统 ,可以作为数据库、缓存和消息中间件。

Redis 提供了丰富的数据结构,包括基础类型和高级类型。
基础类型有:
- String(字符串)
- Hash(哈希)
- List(列表)
- Set(集合)
- ZSet(有序集合)
高级类型:
- Bitmaps(位图)
- HyperLogLogs(基数统计)
- GEO(地理信息)
- Stream(流)
除此之外,Redis 还内置了以下功能:
- 事务
- 发布/订阅
- LUA 脚本
- 多集群方案(主从复制模式、哨兵模式、切片集群模式)
- 不同级别的磁盘持久化
- 过期删除机制
- 内存淘汰机制
- . . .
2. Redis 的优势
使用 Redis,有以下几个显著的好处:
- 高性能: Redis 的数据存储在内存中,所有的读写操作都是在内存中完成,因此读写速度极快,适合高并发场景。
- 丰富的数据结构: Redis 支持多种数据结构,比如字符串、哈希、列表、集合、有序集合等等,以满足多样化的需求。
- 持久化: Redis 支持 RDB 和 AOF 两种持久化方式,以确保数据安全。
扩展:MySQL 先写日志持久化后再写磁盘数据,Redis 先写内存数据之后再通过日志持久化。
这也就导致了 Redis 的持久化不管如何操作都可能会导致数据丢失(主要是服务器故障,服务器不出问题的情况下还是可以保证数据安全的。)
- 高可用性: Redis 通过 主从复制 和 哨兵模式 实现故障转移,保障服务连续性。
- 分布式: Redis 支持 集群模式,可水平扩展,以处理大规模数据。
- 多功能:Redis 提供事务 、发布订阅 、Lua 脚本等功能,增强灵活性。
注意:Redis 不支持绝对的 ACID,但是基本的事务能力是可以提供的。
- 原子性:通过命令队列保证,在命令没有语法(编译时错误)的情况下,可以按原子执行,但运行时错误无法回滚,且会继续执行后续命令。
- 隔离性:单线程
- 持久性:RDB 和 AOF 可以保证不出故障时可以保证。
- 一致性:只要持久性不出故障,原子性不出运行时错误,一致性就是可以保证的。
综上,就是对 Redis 支持事务但不支持绝对的 ACID 的解释。
- 应用广泛: Redis 适用于缓存、会话存储、消息队列、实时排行榜等场景。
综上,这些优势使得 Redis 成为高性能数据存储和缓存的理想选择。
3. 为什么选择 Redis 作为 MySQL 的缓存?
使用 Redis 作为 MySQL 的缓存有以下几个主要原因:
- 提升性能: ++Redis 将数据存储在内存中++ ,其读写速度远快于++将数据存储在磁盘的 MySQL++,让 Redis 作为 MySQL 的缓存,可以显著减少数据库的查询延迟。
- 减轻数据库负载: 通过 Redis 缓存频繁访问的数据,可以减少对 MySQL的直接查询,降低数据库的压力,从而提高系统整体性能。
- 高并发支持: Redis 能处理大量并发请求,适合高流量场景,避免 MySQL 成为瓶颈。
- 丰富的数据结构: Redis 支持多种数据结构(如字符串、哈希、列表等),便于缓存复杂查询结果或中间数据。
- 缓存失效策略: Redis 支持设置缓存过期时间,确保数据及时更新,避免脏数据。
- 高可用性: Redis 提供主从复制和持久化功能,确保缓存数据的高可用性和可靠性
综上,Redis 作为 MySQL 的缓存,可以显著提升系统性能、降低数据库负载,并支持高并发场景。
4. Redis 的经典业务场景
Redis 常用的业务场景如下:
-
对热点数据的缓存: 因为 Redis 支持多种数据类型,数据存储在内存中,访问速度极快,所以 Redis 很适合用来存储热点数据。
-
分布式锁的实现: 可以利用 Redis 的 setnx 命令进行。
-
排行榜的实现: 借助 ZSet 进行热点数据的排序。例如:下单量最多的用户排行榜,最热门的帖子(回复最多)等业务场景;
-
限时类业务的实现: 可以++使用 expire 命令++ 设置 key 的生存时间,到时间后自动删除 key。例如使用在验证码验证 、优惠活动等业务场景;
-
计数器的实现: 因为 ++incrby 命令++ 可以实现原子性的递增,所以可以运用于高并发的秒杀活动 、分布式序列号的生成。例如限制一个手机号发多少条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等业务场景。
-
队列机制的实现: Redis 提供了 listpush 和 list pop 两个命令,所以能够很方便的执行队列操作。
二、相关面试题
1. 什么是 Redis?常用业务场景?
Redis 是一个开源的、基于内存的数据结构存储系统 ,对数据的读写操作都是在内存中完成的,因此读写速度非常快 ,常用于缓存、消息队列、分布式锁等场景。
它支持多种数据结构,比如字符串、哈希、列表、集合、有序集合等。
此外,Redis还支持事务、持久化、过期删除机制、内存淘汰机制、多集群方案等等,适用于高并发场景。
2. 使用 Redis 有哪些好处?
- 第一个好处是高性能 :因为 Redis 的数据都是存储在内存中的,所有的读写操作都是在内存中完成,所以读取速度极快。
- 第二个好处是 Redis 支持丰富的数据结构,比如字符串、列表、集合、有序集合、哈希等;
- 第三个好处是持久化: Redis 会通过 RDB 和 AOF 两种持久化方式,来确保数据安全。
- 此外,Redis 还拥有其他丰富的功能,比如 发布订阅、Lua脚本、主从复制等功能。
3. 为什么有了 MySQL,还要 Redis?
因为 MySQL 作为数据库系统,它对于数据的操作需要访问磁盘。
而我们将那些频繁访问的数据放在 Redis 中,需要访问时就可以直接从内存获取,避免磁盘 I/O,从而提高操作的速度。
所以使用 Redis + MySQL 结合的方式可以有效提高系统 QPS。
4. 为什么用 MySQL 作存储,Redis 作缓冲?
为什么用 MySQL 做存储: MySQL 适用于存储持久化数据、需要保证数据一致性、支持复杂查询和事务管理的场景。
为什么用 Redis 做缓存: Redis 适用于快速访问、临时存储、高并发和低延迟需求的场景,尤其是在需要缓存热点数据、减少数据库负载的情况下。
5. Redis 常用的业务场景有哪些?
Redis 常用业务场景包括缓存、计数器、分布式锁、排行榜等。
其中缓存 和分布式锁是最核心且最广泛的应用场景。
- 因为 Redis 支持多种数据类型,它的数据存储在内存中,访问速度极快,所以 Redis 很适合用来存储热点数据;
- 此外,我们可以利用 Redis 的 setnx 命令进行分布式锁的实现。