缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存双写一致性

缓存淘汰

为何须要缓存淘汰?你须要缓存30G的数据,可是Redis自己只能使用10G的内存,那你就得作个取舍了,毕竟鱼与熊掌不可兼得。为了利益最大化确定要保留最重要的10个G。面试



Redis自己提供了6中缓存淘汰策略,如下属性表示容许使用的最大内存redis

server.maxmemory复制代码

当使用的内存超过限制内存时,Redis会根据配置的如下6中淘汰策略选择数据淘汰算法

  • volatile-lru:从已设置过时时间的数据集中挑选最近最少使用的数据淘汰数据库

  • volatile-ttl:从已设置过时时间的数据集挑选将要过时的数据淘汰缓存

  • volatile-random:从已设置过时时间的数据集中任意选择数据淘汰bash

  • allkeys-lru:从数据集中挑选最近最少使用的数据淘汰多线程

  • allkeys-random:从数据集中任意选择数据淘汰架构

  • no-enviction:内存不足时添加数据会报错(没人用这个吧?)并发

其余相关配置:dom

#指定数据淘汰算法
maxmemory-policy allkeys-lru
#LRU和最小TTL算法的样本个数
maxmemory-samples 5复制代码

缓存穿透

大量的请求瞬时涌入系统,而这个数据在Redis中不存在,从而全部的请求都落到了数据库上从而把数据库打死。形成这种状况的缘由以下:

  • 系统设计不合理,缓存数据更新不及时

  • 爬虫等恶意攻击

解决方案:

  • 若是key在数据库中也不存在,那么就写一个空值到Redis中,并设置一个过时时间,避免一直占用内存

  • 查询缓存以前使用布隆过滤器拦截

缓存击穿

缓存击穿,就是常说的热点key问题,当一个正有很是巨大的访问量访问的key 在失效的瞬间,大量的请求击穿了缓存,直接落到了数据库上,而后全部从数据获取到数据的线程又都并发的想要把数据缓存到redis中。


解决方案:

  • 使用互斥锁,同一时刻只容许一个线程去构建缓存,其余线程等待构建完毕后去缓存取

  • 定时更新,假如缓存过时时间为60分钟,则单独设置一个线程每59分钟去负责更新缓存


缓存雪崩

因为Redis是基于内存的应用,能够很容易作到高性能、高并发从而起到保护数据库的做用。若是缓存意外挂了、全部的请求落到了数据上就造成了缓存雪崩。

解决方案:


数据库缓存双写一致性

当一个数据须要更新时由于不可能作到同时更新数据库和缓存、那么此时读取数据的时候就必定会发生数据不一致问题,而数据不一致问题在金融交易领域的系统中是确定不容许的。


解决方案:

  • 读的时候,先读缓存,缓存没有的话,就读数据库,而后取出数据后放入缓存,同时返回响应。

  • 更新的时候,先更新数据库,而后再删除缓存。


参考自公众号:石杉的架构笔记



相关文章
相关标签/搜索