第一部分:Redis的部署方式
1.单机模式
2.主从模式
定义:主服务器负责写数据,从数据库负责读数据(禁止写),主服务器数据变化时会同步到从服务器
作用:读写分离,数据冗余,故障恢复
工作流程:建立连接阶段,数据同步阶段,命令传播阶段
阶段一:
阶段二:
- 全量复制:将master执行bgsave之前,master中所有的数据同步到slave中
- 部分复制(增量复制):将master执行bgsave操作中,新加入的数据(复制缓冲区中的数据)传给slave,slave通过bgrewriteaof指令来恢复数据
- 数据同步应该避免高峰期,全量复制
阶段三:
- 定义:当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的状态,同步的动作称为命令传播
- 命令传播阶段的部分复制:服务器的运行 id(run id)【身份识别码】,主服务器的复制积压缓冲区【服务器启动即建立缓冲区,用来存储有效的指令】,主从服务器的复制偏移量【通过offset区分不同的slave当前数据传播的差异】
3. 哨兵模式:
定义:哨兵模式是分布式系统,通过监控节点的状态,从slave中选出新的master来解决主服务器宕机的问题。
过程:
- 集群监控:监控 master 和 slave 进程是否正常工作。
- 消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。
- 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。
- 配置中心:故障转移发生了,通知 client 客户端新的 master 地址。
配置哨兵:
- 一拖二主从,配置三个哨兵(配置相同,端口不同)
- 参看sentinel.conf
- 启动哨兵,redis-sentinel sentinel端口号 .conf
4.集群模式
定义:主从和哨兵都还有另外一些问题没有解决,单个节点的存储能力是有上限,访问能力是有上限的。Redis Cluster 集群模式具有高可用、可扩展性、分布式、容错 等特性。
Redis集群的数据存储
(1)数据的存储:1. 通过算法设计,计算出key应该保存的位置;2.存储空间计划切割成16384份,每台主机保存一部分;3.将key按照计算出的结果放到对应的存储空间 (2)数据的寻找:1.数据库互相连通,都会保存数据的编号信息;2. 如果找到了,直接返回; 3,没有找到则被告知具体数据库的位置,直到找到为止
Redis集群动态增加或者减少节点及其原理(待更新)*
第二部分:Redis的异常处理
(一)缓存异常
- 缓存雪崩(缓存有数据--但失效,数据库有):缓存雪崩是指缓存同一时间大面积的失效,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。
- 现象:请求激增,应用服务器无法处理,500错误,数据库崩溃,应用服务器崩溃,Redis服务器崩溃,重启后仍然无效
- 问题:短时间内,大量key集中过期;应用服务,数据库,redis重启后仍然无效
- 解决: 页面静态化处理 构建多级缓存架构 检测Mysql业务进行优化 监控redis服务器性能指标 不断优化redis(合理设置key的时间,不要加锁) 限流、降级
2. 缓存击穿(缓存没有,数据库有):和缓存雪崩不同的是,缓存击穿指并发查同一条数据,很多数据都查不到从而查数据库。
- 问题:某个key过期,该key访问量巨大
- 解决: 提前预防(加大热点key的时长,设置永久key) 即使调整key 设置二级缓存 运行监控测试
3. 缓存穿透(数据库和缓存都没有):缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上, 造成数据库短时间内承受大量请求而崩掉。
- 现象:我们的数据库中的主键都是从0开始的,即使我们将数据库中的所有数据都放到了缓存中。当有人用id=-1来发生恶意请求时,因为redis中没有这个数据,就会直接访问数据库,这就称谓缓存穿透
- 问题:不存在的key
- 解决: 数据进行预校验,如果不存在就直接返回不存在的页面。(数据量较少) 数据量大的话,需要布隆过滤器
(二)缓存其他内容
-
缓存预热:缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题。用户直接查询事先被预热的缓存数据。
-
缓存降级:当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证核心功能服务还是可用的。策略是不访问数据库,直接给默认值。