目录
什么是缓存穿透?怎么解决?
请求去查询一条记录,先查redis没有,再查数据库也没有,请求每次都打在数据库上面,导致数据库压力暴增,这种现象称为缓存穿透
解决:
1.空对象缓存或者缺省值
2.布隆过滤器
什么是缓存雪崩?怎么解决?
redis中有大量key同时过期大面积失效,后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求。
解决:
1.将某些key设置为永不过期或者将过期时间错开
2.缓存集群实现高可用
3.多缓存结合预防
4.服务降级
如何保证数据库和缓存的数据一致性?
四种更新策略:
1.先更新数据库,再更新缓存
数据库同步到缓存失败会读到脏数据
多线程高并发情况下数据最终可能不一致
2.先更新缓存,再更新数据库
不推荐,一般将数据库作为底单数据
多线程高并发情况下数据最终可能不一致
3.先删除缓存,再更新数据库
采用延迟双删策略
4.先更新数据库,再更新缓存
假如缓存删除失败或者来不及,导致请求再次访问redis时缓存命中,读取到的是缓存旧值。
如何保证Redis服务高可用?
通过哨兵和集群来保证高可用
哨兵:吹哨人巡查监控后台master主机是否故障,如果故障了根据投票数自动将某台从库转换为新主库,继续对外服务。
集群:由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序集。
哨兵的作用
1.主从监控:监控主从redis库是否正常运行
2.消息通知:将故障转移的结果发送给客户端
3.故障转移:如果master异常,则会进行主从切换,将其中一个slave作为master
4.配置中心:客户端通过连接哨兵来获取当前redis服务的主节点地址
Redis虚拟槽分区有什么优点?
方便扩缩容和数据分派查找,解耦了数据和节点之间的关系,提升了集群的横向扩展性和容错性。
为什么Redis集群最大槽数是16384?
(1)如果槽位为65536,发送心跳信息的消息头达8k,发送的心跳包过于庞大。
(2)redis的集群主节点数量基本不可能超过1000个。
(3)槽位越小,节点少的情况下,压缩比高,容易传输
集群中的节点如何保持通信?
Redis集群中的各个节点基于Grossip协议来进行通信共享信息,每个Redis节点都维护了一份集群的状态信息。