缓存淘汰
为什么需要缓存淘汰?你需要缓存30G的数据,但是Redis本身只能使用10G的内存,那你就得做个取舍了,毕竟鱼与熊掌不可兼得。为了利益最大化肯定要保留最重要的10个G。
Redis本身提供了6中缓存淘汰策略,以下属性表示允许使用的最大内存
1
|
server.maxmemory
|
当使用的内存超过限制内存时,Redis会根据配置的以下6中淘汰策略选择数据淘汰
- volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
- volatile-ttl:从已设置过期时间的数据集挑选将要过期的数据淘汰
- volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
- allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
- allkeys-random:从数据集中任意选择数据淘汰
- no-enviction:内存不足时添加数据会报错(没人用这个吧?)
其他相关配置:
1 2 3 4 |
指定数据淘汰算法 maxmemory-policy allkeys-lru LRU和最小TTL算法的样本个数 maxmemory-samples 5 |
缓存穿透
大量的请求瞬时涌入系统,而这个数据在Redis中不存在,从而所有的请求都落到了数据库上从而把数据库打死。造成这种情况的原因如下:
- 系统设计不合理,缓存数据更新不及时
- 爬虫等恶意攻击
解决方案:
- 如果key在数据库中也不存在,那么就写一个空值到Redis中,并设置一个过期时间,避免一直占用内存
- 查询缓存之前使用布隆过滤器拦截
缓存击穿
缓存击穿,就是常说的热点key问题,当一个正有非常巨大的访问量访问的key 在失效的瞬间,大量的请求击穿了缓存,直接落到了数据库上,然后所有从数据获取到数据的线程又都并发的想要把数据缓存到redis中。
解决方案:
- 使用互斥锁,同一时刻只允许一个线程去构建缓存,其他线程等待构建完毕后去缓存取
- 定时更新,假如缓存过期时间为60分钟,则单独设置一个线程每59分钟去负责更新缓存
缓存雪崩
由于Redis是基于内存的应用,可以很容易做到高性能、高并发从而起到保护数据库的作用。如果缓存意外挂了、所有的请求落到了数据上就形成了缓存雪崩。
解决方案:
- 事前:使用主从复制+哨兵或者Redis集群。Redis主从复制、Redis的哨兵机制、Redis集群环境搭建
- 事中:本地缓存结合限流和降级。基于注解的分布式限流组件
- 事后:开启持久化配置,实现快速缓存的快速恢复。 Redis 的持久化机制
数据库缓存双写一致性
当一个数据需要更新时因为不可能做到同时更新数据库和缓存、那么此时读取数据的时候就一定会发生数据不一致问题,而数据不一致问题在金融交易领域的系统中是肯定不允许的。
解决方案:
- 读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
- 更新的时候,先更新数据库,然后再删除缓存。
参考自公众号:石杉的架构笔记
相关推荐
Redis系统学习之缓存穿透,缓存击穿,缓存雪崩的概念及其解决方案.docx
缓存穿透、缓存击穿、缓存雪崩的描述
如何设计缓存系统:缓存穿透,缓存击穿,缓存雪崩解决方案分析.docx
Redis缓存穿透,缓存击穿,缓存雪崩面试题解析
二、缓存穿透,缓存击穿和缓存雪崩 缓存穿透 描述:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1024”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致...
缓存穿透,缓存击穿,缓存雪崩解决方案分析.docx
缓存穿透,缓存击穿和缓存雪崩的区别以及解决方案.docx
常见的缓存穿透,缓存击穿,缓存雪崩解决方案分析.docx
缓存穿透、缓存击穿、缓存雪崩区别和解决方案【php】.docx
前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并
2.从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也
redis缓存雪崩,redis缓存穿透,redis缓存击穿 redis应对高并发造成的雪崩、穿透、击穿
也就是缓存穿透、缓存击穿、缓存雪崩的知识以及其相对应的解决方案! 本章共讲解了缓存的三种异常情况,上述的三种错误,都是因为原本就应该访问缓存中数据的,但却在缓存中不存在,亦或者是服务出现故障,导致程序...
缓存雪崩,缓存穿透,缓存击穿出现的原因及解决方案.docx
面试中缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级怎么解答 面试中缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级怎么解答 面试中缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级怎么解答
缓存击穿:某一个热点数据,缓存中某一时刻失效了,因而大量并发请求打...缓存雪崩:指的是大面积的 key 同时过期,导致大量并发打到我们的数据库。不像击穿,只是因为 1 个 key 的过期。 缓存穿透:数据库里“没”数据。
什么是redis缓存穿透 雪崩 ,如何应对解决 redis缓存穿透 雪崩 的解决办法 redis缓存穿透的解决办法 redis雪崩的解决办法
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用于特别多,同时读取缓存没有读到数据,有同时去数据库去取数据,引起数据库压力瞬间增大
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,...
Redis 缓存穿透的处理(缓存空值) Redis缓存击穿处理(互斥锁与逻辑删除方案) 封装为工具类,并适用于所有需要进行缓存穿透、击穿的方案,采用了泛型以及Lambda 函数式编程来完成编码