分布式锁 哨兵模式_redis主从复制、哨兵模式、缓存穿透|击穿|雪崩

2c45676f3558f536edd45a7b9d1f4cde.png

a8b67e89bb848bf5d30ebba1dacf5b83.png

subscribe + 频道名 //订阅频道名

publish + 频道名 + 消息

c752341202dfebf6ae5de7d524130587.png

2ca902069b0d918d94781fd151a1ce41.png

redis发布订阅底层实现原理

abce466f3ad91a8ebfe5dc8d88e8e967.png

Redis主从复制

22a54f4f9883041a8c71d1a73a34f2ee.png

查看当前库的信息 info replication

redis模拟集群(伪集群:单机多集群)

85e84a20f0fa3ddb26608893098304ed.png

1 服务器加载配置文件(redis-server +配置文件)

2 建立连接

默认情况下,都是master (info replication可以查看)

3 配置slave (认老大)

方式一:命令(暂时的): slaveOf host(ip) port

方式二:配置文件(永久的) replica-server masterIp masterPort

主从复制 : 主机可以写,从机不能写只能读! 主机的所有数据都会被从机保存

没配哨兵机制时 :主机机断开后, 再重新恢复后, 连接恢复正常。从机机断开后, 再变成从机重新连接后, 连接恢复正常。

没配哨兵机制,使用命令配置主机, 从机断电重启会重新 变成主机

复制原理:1 全量复制 2 增量复制

427828cd7f02a72f687b96c4e6e1a860.png

套娃复制模型

59ca405b65fefb3e632990471af80ec5.png

无哨兵机制时 :

master主节点断开了, 就需要手动设置主节点:slaveOf no one

如果master 恢复时发现,已经有新的master了, 那么自己将不再有slave (----------世事变了,没小弟了)

哨兵模式 (自动版选老大)

4768c51d39edea38f20ebce69a9ff259.png

4e3b1555fdb3f527132614e05b3353ba.png

a3c437dfcd6cb4e0f8a5d835e1705c04.png

96b071d31342b42bb7779de605186f27.png

哨兵模式配置: 创建配置文件: sentinel.conf

sentinel moniter 哨兵监控 (主节点名:自己起名字就行)

82bd54b522eb1b83b5375029fa3f635a.png

哨兵配置后 主机回来后, 只能配置在新的主机下, 当从机

哨兵模式优点 :

1 基于主从复制模式,所有主从的优点哨兵都有,

2 主从可以切换, 故障可以转移, 系统的可用性会更好

3 主从模式可以自动升级, 更加健壮

缺点:

1 不好在线扩容:集群容量达到上线时,在线扩容就非常麻烦

2 实现哨兵模式的配置,比较麻烦,里面有很多配置需要选择:如果有哨兵集群, 还需要配置每个哨兵端口。

缓存穿透与雪崩

缓存穿透:

d86e7ef53fa2e9b8256612375bb2e5d8.png

执行一个SQL语句之前, 首先会查看换从中有该SQL语句没, 有的话直接返回缓存数据, 没有的话再去数据库(集群)查询,但是

假如: 有一个可以持续发送大量SQL请求的client持续不断的查询数据库中不存在的数据, 这样,redis缓存中不会有返回结果,所以每次都得去数据库集群中查询, 这样大量的请求会给数据库造成很大压力,这就相当于缓存穿透。

所以,我们不仅要有能查询到结果的缓存, 最好也做个空缓存,专门保存空的查询, 这样,会降低数据库集群受攻击。

可以使用布隆过滤器来保证一定不存在(作空值缓存)

cf0e0ec4f429daee926f191a2f4d34c9.png

空值缓存又有问题:

1 如果可以做空值缓存, 那么意味着需要很大的空间作空值缓存(因为空值是特别特别的空值键)

2 即使对空值设置了过期时间,仍然可能会存在一段时间缓存层和存储层的不一致 , 这对需要保持一致性的业务会有影响

缓存击穿

即:非常热频的键,在过期的瞬间导致大量的并发请求直接访问数据库, 并且都把拿到的数据写进缓存,给数据库造成非常大的压力。(eg:微博热搜)

a73be2404e539f09f77aeda05aeaec66.png

缓存穿透 和 缓存击穿

缓存穿透(很多请求查不到):大量请求绕过缓存直接访问数据库中不存在的数据(缓存中不存在,数据库中也不存在)

缓存击穿(很多请求都来查):缓存失效的瞬间,大量请求直接访问数据库

(缓存有变无, 数据库中有)

缓存击穿解决方案1:热点数据不过期

其实就是:热点数据不设置过期时间, 当然也就没有热点数据过期导致的缓存击穿问题

缓存击穿解决方案2:加分布式锁

分布式锁: 使用分布式锁可以保证:对每个key, 同时只有一个线程能查询后端服务,其他线程都只能等待。

分布式锁将高并发的压力转移到了分布式锁上, 因此对分布式锁的考验很大

缓存雪崩

071ae8f82421484ba2c01575ed31598b.png

9e25018ae9e06ce558befdf3118185e7.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值