subscribe + 频道名 //订阅频道名
publish + 频道名 + 消息
redis发布订阅底层实现原理
Redis主从复制
查看当前库的信息 info replication
redis模拟集群(伪集群:单机多集群)
1 服务器加载配置文件(redis-server +配置文件)
2 建立连接
默认情况下,都是master (info replication可以查看)
3 配置slave (认老大)
方式一:命令(暂时的): slaveOf host(ip) port
方式二:配置文件(永久的) replica-server masterIp masterPort
主从复制 : 主机可以写,从机不能写只能读! 主机的所有数据都会被从机保存
没配哨兵机制时 :主机机断开后, 再重新恢复后, 连接恢复正常。从机机断开后, 再变成从机重新连接后, 连接恢复正常。
没配哨兵机制,使用命令配置主机, 从机断电重启会重新 变成主机
复制原理:1 全量复制 2 增量复制
套娃复制模型
无哨兵机制时 :
master主节点断开了, 就需要手动设置主节点:slaveOf no one
如果master 恢复时发现,已经有新的master了, 那么自己将不再有slave (----------世事变了,没小弟了)
哨兵模式 (自动版选老大)
哨兵模式配置: 创建配置文件: sentinel.conf
sentinel moniter 哨兵监控 (主节点名:自己起名字就行)
哨兵配置后 主机回来后, 只能配置在新的主机下, 当从机
哨兵模式优点 :
1 基于主从复制模式,所有主从的优点哨兵都有,
2 主从可以切换, 故障可以转移, 系统的可用性会更好
3 主从模式可以自动升级, 更加健壮
缺点:
1 不好在线扩容:集群容量达到上线时,在线扩容就非常麻烦
2 实现哨兵模式的配置,比较麻烦,里面有很多配置需要选择:如果有哨兵集群, 还需要配置每个哨兵端口。
缓存穿透与雪崩
缓存穿透:
执行一个SQL语句之前, 首先会查看换从中有该SQL语句没, 有的话直接返回缓存数据, 没有的话再去数据库(集群)查询,但是
假如: 有一个可以持续发送大量SQL请求的client持续不断的查询数据库中不存在的数据, 这样,redis缓存中不会有返回结果,所以每次都得去数据库集群中查询, 这样大量的请求会给数据库造成很大压力,这就相当于缓存穿透。
所以,我们不仅要有能查询到结果的缓存, 最好也做个空缓存,专门保存空的查询, 这样,会降低数据库集群受攻击。
可以使用布隆过滤器来保证一定不存在(作空值缓存)
空值缓存又有问题:
1 如果可以做空值缓存, 那么意味着需要很大的空间作空值缓存(因为空值是特别特别的空值键)
2 即使对空值设置了过期时间,仍然可能会存在一段时间缓存层和存储层的不一致 , 这对需要保持一致性的业务会有影响
缓存击穿
即:非常热频的键,在过期的瞬间导致大量的并发请求直接访问数据库, 并且都把拿到的数据写进缓存,给数据库造成非常大的压力。(eg:微博热搜)
缓存穿透 和 缓存击穿
缓存穿透(很多请求查不到):大量请求绕过缓存直接访问数据库中不存在的数据(缓存中不存在,数据库中也不存在)
缓存击穿(很多请求都来查):缓存失效的瞬间,大量请求直接访问数据库
(缓存有变无, 数据库中有)
缓存击穿解决方案1:热点数据不过期
其实就是:热点数据不设置过期时间, 当然也就没有热点数据过期导致的缓存击穿问题
缓存击穿解决方案2:加分布式锁
分布式锁: 使用分布式锁可以保证:对每个key, 同时只有一个线程能查询后端服务,其他线程都只能等待。
分布式锁将高并发的压力转移到了分布式锁上, 因此对分布式锁的考验很大
缓存雪崩