Redis 实现将 MySQL 查询结果 缓存的核心思路是利用 Redis 作为中间缓存层,避免重复查询 MySQL,提升数据读取性能和系统的响应速度,掌握redis的高可用很有必要
一、Redis缓存实现原理
Redis 缓存 MySQL 查询结果的核心流程:
先查询 Redis 缓存。
如果缓存命中,直接返回结果。
如果缓存未命中,查询 MySQL 数据库,并将结果写入 Redis,设置过期时间。
后续请求直接从 Redis 缓存读取,提高系统性能,降低 MySQL 压力。
通过合理的 缓存策略 和 缓存过期时间,Redis 可以极大地提升数据读取性能,是 MySQL 数据库加速的重要手段。
流程图
用户请求 → Redis → 缓存命中? → 是 → 返回数据
→ 否 → 查询 MySQL → 将结果存入 Redis → 返回数据
1.1 Redis 缓存要点
缓存过期时间(TTL):
为避免数据过时或 Redis 缓存膨胀,给缓存设置过期时间。例如 setex 命令设置缓存有效期。
缓存键设计:
缓存键(Key)应具有唯一性,通常可以使用业务逻辑生成,例如:
user:1 表示用户表中 ID 为 1 的用户数据。
product:123 表示商品表中 ID 为 123 的商品数据。
缓存一致性:
当 MySQL 数据更新时,应同步更新 Redis 缓存,避免缓存与数据库数据不一致。
常用方案:
缓存失效策略:更新 MySQL 数据时,删除 Redis 缓存(下次访问重新查询并缓存)。
消息队列:通过异步消息队列(如 Kafka、RabbitMQ)通知缓存更新。
热点数据预加载:
对访问频率极高的热点数据,可以在系统启动时提前加载到 Redis,减少首次访问的延迟。
防止缓存穿透、击穿、雪崩:
缓存穿透:对不存在的数据进行查询,导致 MySQL 压力增大。解决方案:使用空值缓存或布隆过滤器。
缓存击穿:热点数据缓存过期时大量请求同时查询数据库。解决方案:加锁、设置随机过期时间。
缓存雪崩:大量缓存同时过期。解决方案:设置随机过期时间,避免缓存同时失效。
二、高可用方案对比
方案 | 自动故障恢复 | 数据分片 | 扩展性 | 适用场景 |
---|---|---|---|---|
Redis主从复制 | 否 | 否 | 差 | 读多写少、简单数据备份 |
Redis哨兵模式(Sentinel) | 是 | 否 | 一般 | 中小规模高可用场景 |
Redis Cluster | 是 | 是 | 好 | 大数据量、高并发场景 |
Redis主从复制 + Keepalived | 是 | 否 | 差 | 小规模高可用场景 |
云服务 Redis(公有云厂商) | 是 | 是 | 好 | 需要快速部署的高可用场景 |
主从复制 使用场景和Redis + Keepalived 只是在主从多了vip 做高可用,这里只记录Redis主从复制
2.1 Redis主从复制
主从复制是 Redis 实现数据冗余和读写分离的基本方案。
数据在主节点(Master)上写入,从节点(Slave)通过复制主节点的数据进行同步。
特点
- 数据同步:
主节点负责写操作,并将数据同步给从节点。从节点只能处理读操作,不能进行写操作。 - 读写分离:
主节点处理写操作,从节点处理读操作,分担主节点的压力。 - 故障处理:
如果主节点故障,需要手动将一个从节点提升为新的主节点。 - 一致性:
数据在主从之间同步存在一定的延迟,不保证完全实时一致性。
2.2 哨兵模式
哨兵模式是在主从复制的基础上,通过 Sentinel 组件实现主从节点的监控和自动故障转移,提升高可用性。
特点
- 主从监控:
Sentinel 实时监控主节点和从节点的状态,判断节点是否正常工作。 - 自动故障转移:
当主节点故障时,Sentinel 自动将从节点提升为新的主节点,并通知其他从节点进行同步。 - 通知机制:
Sentinel 能通知客户端主节点变更,更新连接信息。 - 一致性:
与主从复制一样,数据同步存在延迟,不保证完全实时一致性。
2.3 Redis Cluster
- Redis Cluster 是 Redis 原生支持的分布式架构,提供 数据分片 和 多主多从 功能,解决了单机 Redis 在存储容量和性能方面的限制。
- 集群通过 16384 个槽(slots) 将数据分片存储到多个主节点(Master)上,每个主节点有若干从节点(Slave)提供数据冗余。
特点
- 数据分片:
数据通过槽(slot)分散存储在多个主节点上,实现水平扩展。 - 高可用性:
每个主节点都有从节点作为备份,主节点故障时,从节点自动提升为主节点。 - 多主多从:
集群中每个主节点都能处理读写请求。 - 自动故障恢复:
集群会自动检测主节点故障,并进行故障转移。 - 一致性:
数据在主从节点之间的同步仍然存在延迟,不保证强一致性。 - 客户端直连:
客户端需要支持 Redis Cluster 协议,直接与多个节点交互。
三、哨兵模式安装以及配置
Redis Sentinel 通过监控主从复制中的 Master 和 Slave 状态,提供 自动故障恢复 和 高可用管理,实现主从切换。
3.1 环境准备
假设你有 3 台 Redis 实例,分别是:
- 主节点(Master):
192.168.1.1:6379
- 从节点(Slave1):
192.168.1.2:6379
- 从节点(Slave2):
192.168.1.3:6379
此外,部署 3 个 Sentinel 实例来监控这些 Redis 节点。
3.2 配置 Redis 主从复制
- 修改 从节点 配置文件,将其设置为主节点的从节点。
Slave 配置示例:
confCopy code# redis.conf 配置文件(Slave 节点)
replicaof 192.168.1.1 6379
- 启动 Redis 服务:
redis-server /path/to/redis.conf
3.3 配置 Sentinel
在每台机器上配置一个 Sentinel 实例,分别创建 sentinel.conf
文件。以下是配置示例:
confCopy code# sentinel.conf 配置文件
port 26379 # Sentinel 监听端口
sentinel monitor mymaster 192.168.1.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 15000
参数说明:
- sentinel monitor:定义监控的主节点,
mymaster
是自定义名称,2
表示至少有 2 个 Sentinel 认为主节点宕机,才触发故障转移。 - down-after-milliseconds:判定主节点宕机的超时时间(毫秒)。
- parallel-syncs:故障恢复后并行同步从节点的数量。
- failover-timeout:故障转移的最大超时时间。
3.4 启动 Sentinel
启动 3 个 Sentinel 实例:
redis-sentinel /path/to/sentinel.conf
3.5 验证哨兵模式
-
观察 Sentinel 状态:
使用以下命令连接 Sentinel 查看主从状态:redis-cli -p 26379 info Sentinel
-
模拟主节点故障:
停止主节点服务:redis-cli -h 192.168.1.1 -p 6379 shutdown
- Sentinel 会自动检测到主节点故障,将一个从节点提升为新的主节点。
-
查看新的主节点:
在 Sentinel 监控中查看新的主节点:redis-cli -p 26379 sentinel get-master-addr-by-name mymaster
哨兵模式:适合小规模部署,要求高可用但不需要水平扩展。
四、Redis Cluster 模式安装以及配置
Redis Cluster 是 Redis 提供的原生分布式高可用方案,通过 数据分片 和 多主多从 模式实现高可用和负载均衡。
4.1 环境准备
假设需要创建一个包含 3 个主节点和 3 个从节点的 Redis Cluster。
- 主节点(Master):
192.168.232.1:7000
、192.168.232.2:7001
、192.168.232.3:7002
- 从节点(Slave):
192.168.232.1:7003
、192.168.232.2:7004
、192.168.232.3:7005
4.2 配置 Redis Cluster 节点
为每个 Redis 实例配置 redis.conf
文件。
配置示例(redis-7000.conf
):
confCopy codeport 7000
cluster-enabled yes # 启用 Redis Cluster
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000 # 集群节点超时时间
appendonly yes # 开启数据持久化
修改不同实例的 port
和 cluster-config-file
,其他配置相同。
4.3 启动 Redis 实例
启动所有 Redis 节点:
redis-server /path/to/redis-7000.conf
redis-server /path/to/redis-7001.conf
redis-server /path/to/redis-7002.conf
redis-server /path/to/redis-7003.conf
redis-server /path/to/redis-7004.conf
redis-server /path/to/redis-7005.conf
4.4 创建 Redis 集群
使用 redis-cli
工具初始化集群,将 3 个节点设为主节点,3 个节点设为从节点。
执行以下命令:
redis-cli --cluster create 192.168.232.1:7000 192.168.232.2:7001 192.168.232.3:7002 \
192.168.232.1:7003 192.168.232.2:7004 192.168.232.3:7005 --cluster-replicas 1
说明:
--cluster-replicas 1
表示每个主节点有 1 个从节点。
初始化后,Redis Cluster 会自动分配 16384 个槽(Slots)到各个主节点。
4.5 验证 Redis Cluster
-
查看集群状态:
任意节点执行以下命令查看集群信息:redis-cli -h 192.168.232.1 -p 7000 cluster nodes
-
数据测试:
-
插入数据到集群中:
redis-cli -c -h 192.168.232.1 -p 7000 set key1 value1
-c
参数表示客户端支持 Redis Cluster 模式。 -
数据自动分配到不同槽,查看存储数据的节点。
-
-
故障测试:
停止某个主节点,查看集群自动进行故障转移:redis-cli -h 192.168.232.1 -p 7000 shutdown
从节点会自动提升为主节点,保证集群高可用。
Redis Cluster:适合大规模高并发场景,支持数据分片和水平扩展,适用于大数据量和高可用需求。
Comments | NOTHING