目录
redis的三大缓存问题
- 正常情况下,大部分的访问请求应该是先被redis响应的,在redis那里得不到响应的小部分访问请求才会去请求MySQL数据库获取数据,这样MySQL数据库的负载压力是非常小的,且可以正常工作。
- 缓存雪崩/穿透/击穿问题的根本原因在于redis缓存命中率下降,大量请求会直接发给MySQL数据库,导致MySQL数据库压力过大而崩溃。
- 缓存雪崩:redis中大量不同的缓存key集体过期
- 缓存穿透:大量请求访问redis和MySQL数据库都不存在的资源
- 缓存击穿:redis中一个热点key过期,此时又有大量请求访问这个热点key
缓存雪崩解决方案
- 使用随机数设置key的过期时间,防止集群过期
- 设置二级缓存
- 数据库使用排他锁,实现加锁等待
缓存穿透解决方案
- 对空值也进行缓存
- 使用布隆过滤器进行判断拦截一定不存在的无效请求
- 使用脚本实时监控,进行黑名单限制
缓存击穿解决方案
- 设置永不过期
- 预先对热点数据进行缓存预热
- 数据库使用排他锁,实现加锁等待
集群怎么工作的?
- 先用crc16算法对键进行计算。得到一个数字,然后对这个数字除以16384取余数,得到键的hash槽,自动跳转到hash槽所在的节点进行数据的操作
主从复制、哨兵模式、集群模式的区别?
- 主从复制可以实现数据的备份,读的负载均衡,但是无法自动故障恢复,哨兵可以实现主节点故障的自动恢复;哨兵无法解决写的负载均衡,而集群模式可以解决(集群是多个组,可以相互跳转进行负载均衡的写入);为什么能解决单机存储的问题,集群通过数据分片的方式,将数据分散存储在各个节点充分利用每个节点的空间
#redis集群端口号16379;26379哨兵端口号;redis6379;
redis主从复制流程
- 首次同步:当从节点要进行主从复制时,它会发送一个SYNC命令给主节点。主节点收到SYNC命令后,会执行BGSAVE命令来生成RDB快照文件,并在生成期间使用缓冲区记录所有写操作。
- 快照传输:当主节点完成BGSAVE命令并且快照文件准备好后,将快照文件传输给从节点。主节点将快照文件发送给从节点,并且在发送过程中,主节点会继续将新的写操作缓冲到内存中。
- 追赶复制:当从节点收到快照文件后,会加载快照文件并应用到自己的数据集中。一旦快照文件被加载,从节点会向主节点发送一个PSYNC命令,以便获取缓冲区中未发送的写操作。
- 增量复制:主节点收到PSYNC命令后,会将缓冲区中未发送的写操作发送给从节点,从节点会执行这些写操作,保证与主节点的数据一致性。此时,从节点已经追赶上了主节点的状态。
- 同步:从节点会继续监听主节点的命令,并及时执行主节点的写操作,以保持与主节点的数据同步。主节点会定期将自己的操作发送给从节点,以便从节点保持最新的数据状态.
哨兵原理
- 1每个哨兵都会定时探测主节点、从节点、及其它哨兵节点的运行状态
- 当哨兵节点探测主节点异常,则认为主节点主观下线
- 当超过指定数量的哨兵节点认为主节点主观下线,则认定主节点客观下线
- 哨兵节点会通过raft算法选举出leader,再由leader负责故障转移和通知
- 将一个从节点提升为新的主节点,让其它从节点指向新的主节点做主从复制
- 写VIP也会漂移到新的主节点上
- 原主节点恢复后也会自动变成从节点指向新的主节点做主从复制