Redis
Redis是什么?
在哪里用到了Redis?结合项目
缓存穿透
查询一个不存在的数据,mysql也查不到,数据也不会写入缓存中,就每次都会直接跳过缓存查询DB导致
解决办法:
1.缓存空数据,把空数据进行缓存
2.使用bool过滤器,检索元素是否在集合中,在就继续查询,如果没有就直接返回空,内存占用少,不会有多余的key,但是实现复杂可能会误判
缓存击穿
某个key设置的时间过期了,这是恰好有大量针对这个key的并发请求过来,这时候可能会把DB压垮
解决办法
1.互斥锁(强一致,性能差)
设置一个互斥锁,限制数据库在一段时间内只能被一个线程读取
2.逻辑过期(高可用,性能好)
不设置过期时间,每次查询缓存的时候唤醒并重置逻辑过期时间
缓存雪崩
在同一时段内大量key同时失效或者Redis服务宕机
1.给不同的Key的TTL添加随机值
2.利用Redis集群(哨兵模式,集群模式)或者使用多级缓存,或者降级限流
问:mysql数据如何与redis数据同步呢?(双写一致性)
在项目中,主要是针对文章的热点数据进行缓存,不需要保证实时性,于是使用了异步方案进行同步数据。
我们使用的是延时一致性进行保持的一致性,使用Rabbitmq,这个插件有很强的可靠性。
1.添加依赖,在yml中加入配置
2.在每次修改或者新增数据的时候添加sendMessage进行插入数据,insert和update
读操作:缓存命中直接返回
写操作:延迟双删,无论是先删除数据库数据还是缓存都会产生脏数据,所以需要使用分布式锁,使用共享锁,读的时候不互斥,写的时候互斥,
使用MQ,在修改数据时发送消息,保证MQ的可靠性,还可以使用cannal。
Redis持久化
redis作为缓存,数据持久化怎么做的?
1.RDB :Redis数据快照,使用save/bgsave执行RDB,将内存的数据记录到磁盘中,save 900 1(900s内如果有一个key被修改,则执行bgsave,在conf文件中配置)
2.AOF:追加文件,redis处理的每次写命令会在AOF中,需要在redis.conf配置文件中开启AOF功能,经常使用everysec,
数据过期策略
redis的key过期后如何处理?
1.惰性删除 :过期后不删除,当需要的时候检查是否过期,过期就删掉重新写入,没有就直接读取
2.定期删除:每隔一段时间检查+删除。Slow模式/Fast模式
Redis数据淘汰策略
分布式锁
秒杀抢购时,使用redisson实现,Watch dog(看门狗)每隔releaseTime/3的时间做一次续期,都是基于lua脚本
消息队列
集群模式
主从复制
哨兵模式
分片集群