1.为什么要使用Redis?
a.实现分布式锁
redis提供了可以用来实现分布式锁的方法,比如redis的setnx方法等
b.提高性能
通过redis可以实现基于内存的数据库,可以通过redis实现对请求的缓存。
c.实现高并发
redis的缓存功能、以及可以通过redis可以实现类似与消息队列的能够,避免了大量请求同时调用数据库。
2.单线程的Redis为什么这么快?
a.绝大数的请求操作都是纯粹的内存操作
b.采用了单线模式,避免了不必要的上下文切换和竞争条件
这里的单线程指的是网络请求模块只使用了一个线程(所以不必考虑并发安全性),即一个请求处理所有网络请求,其他模块仍使用了多个线程。
c.非阻塞IO—IO多路复用
IO多路复用实现了可以同时监听多个客户端。
IO多路复用与多线程相,IO多路复用不需要切换到内核进行线程切换,需要更少的时间和资源.
3.Redis过期策略和内存淘汰机制
定时删除:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除
惰性删除: key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。
定期删除: 每隔一段时间执行一次删除过期key操作
注:redis一般使用定时删除、定期删除;
mercached只使用惰性删除。
4.使用Redis有什么缺点?
缓存和数据库双写一致性问题(数据库中数据与缓存数据不一致)
强一致性:缓存和数据库数据始终保持一致
最终一致性:缓存和数据库数据有一段时间不一致,单不影响查询结果。
解决方案:
a.延时双删策略
(1)先淘汰缓存
(2)再写数据库(这两步和原来一样)
(3)休眠1秒,再次淘汰缓存 (休眠时间根据业务场景)
其他:https://cloud.tencent.com/developer/article/1500579(结合队列等)
缓存雪崩问题
缓存雪崩,是指在某一个时间段,缓存集中过期失效。
解决方法:根据业务特点,对不同的“记录”设置不同的失效周期。
缓存穿透问题
缓存穿透,是指查询一个数据库一定不存在的数据。 假如有恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮数据库。即便是采用UUID,也是很容易找到一个不存在的KEY,进行攻击。
解决方法: 如果从数据库查询的对象为空,也放入缓存,只是设定的缓存过期时间较短,比如设置为60秒
缓存击穿问题
缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。
解决方案:对热点数据设置比较长的生命周期或者永不过期。
缓存的并发竞争问题
多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了。
解决方法: CAS类的乐观锁(即redis事务机制)
来源:https://blog.csdn.net/weixin_40990818/article/details/100883872