Redis缓存问题

缓存穿透
原理
比如有人得到你的请求路径,恶意伪造请求攻击你的数据库


布隆过滤器可能会存在误判
在布隆过滤器的具体实现中可以设置误判率,一般设置在百分之五以内

回答

缓存击穿
原理



回答

缓存雪崩
原理

回答

总结

双写一致性

强一致性

先删除缓存再操作数据库
正常情况
非正常情况,可能会出现数据不一致问题

先操作数据库再删除缓存
正常情况
非正常情况
当线程一恰好查到过期的缓存,查数据库,此时线程二还未操作数据库,线程一拿到的是旧数据,也会把旧数据写入缓存,造成缓存和数据库数据不一致
因此两种操作都会导致数据不一致
延时双删

读写锁对比分布式锁
左边为使用分布式锁,只有一个线程得到锁才可以继续操作
因此效率低下
而右边是读写锁,效率较高
读锁
写锁

注意获取的是同一把锁
因为会阻塞其他线程,因此性能比较低下,只推荐强一致性使用
对一致性要求不严格的场景
由于使用的消息中间件,所以必定有延迟

回答

Redis持久化问题

RDB

linux中,进程无法直接操作物理内存,只能操作虚拟内存,通过页表将对虚拟内存的操作映射到物理内存中
AOF




Redis过期策略

惰性删除
即使用的时候判断一次
定期删除

回答

Redis淘汰策略
原理



总结

分布式锁

抢券场景超卖问题
正常情况
出现超卖
线程一和线程二查询的时候都是1,两个都减去一个,那么库存变成-1,即出现了超卖问题
互斥锁
使用互斥锁
但互斥锁只能在同一个jvm中生效,如果多台机器同时部署,那么无法获得同一把锁
分布式锁
获得的不是同一把锁
使用Redis作为分布式锁

分布式锁原理
主要要给锁设置过期时间,否则会出现,持有锁的业务宕机了无法释放锁,那么其他线程只能等待,会造成死锁问题
同时还有锁的过期时间设置,根据业务时间预估是不可行的,比如网络波动都会影响,因此需要给锁续期,可以开启一个新的线程监视,redis已经帮我们实现了这样的锁
分布式锁Redisson
redisson的重试机制并不是一直循环等待
如果自己设置了锁的存在时间,那么看门狗机制就不会生效
lua脚本保证执行命令的原子性
Redisson可重入锁
同一个线程可以重复获取同一把锁
每次获取一次锁value+1,释放一次锁value-1
Redisson主从一致性
当写入从主节点获取锁时,主节点宕机那么redis的哨兵机制会重新推举出一个主节点,此时一个新的线程来获取锁可以成功,那么锁的互斥性就失效了,可能会出现脏数据问题
使用zookeeper可以实现分布式锁的强一致性
总结

Redis集群方案

主从复制
原理




回答

哨兵模式
原理
主从模式一写多读,无法解决Redis的高可用问题


脑裂问题
正常模式下,主从节点处于一个网络下,可以正常监控
假如网络出现问题,哨兵无法监测主节点,主节点也没有宕机,那么此时哨兵会从从节点中推举出一个主节点,此时有两个主节点,即脑裂
网络恢复后,老的master节点会被降级成为slave几点,此时从新的master节点同步数据,老的master会清空自己的数据,但之前脑裂客户端也向老master节点写入数据,导致数据丢失
通过这两个配置,达不到这样的要求,则拒绝客户端的写入请求,防止大量数据丢失
回答

分片集群
原理
有很多个master节点,每个master节点又附带一些slave节点

如果想要一些业务相关的key放到一个master,那么就可以对key设置一样的有效部分,例如右侧的aaa
回答
分片集群解决了海量数据存储,高并发写的问题,同时也有哨兵模式的自动推举master
Redis单线程为什么还快

用户空间与内核空间

阻塞IO

非阻塞IO
这种效率也不高
IO多路复用


Redis网络模型
加入了两个多线程,降低了网络IO
总结

如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时