转载地址:http://zeroq.me/p/279
一、缓存穿透
我们在项目中使用缓存通常都是APP先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了。
这个问题其实经常遇到,只是没有引起足够的重视,在我想来,如果碰到这样的问题可以在封装的缓存SET和GET部分增加个步骤,如果查询一个KEY不存在,就已这个KEY为前缀设定一个标识KEY;以后再查询该KEY的时候,先查询标识KEY,如果标识KEY存在,就返回一个协定好的非FALSH或者NULL值,然后APP做相应的处理,这样缓存层就不会被穿透。当然这个验证KEY的失效时间不能太长。
二、缓存并发
有时候如果网站并发访问高,一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况,如果并发确实很大,这也可能造成DB压力过大,还有缓存频繁更新的问题。
我现在的想法是再APP中对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询。
三、缓存失效
引起这个问题的主要原因还是高并发的时候,平时我们设定一个缓存的过期时间时,可能有一些会设置5分钟啊,10分钟这些;并发很高时可能会出在某一个时间同时生成了很多的缓存,并且过期时间都一样,这个时候就可能引发一当过期时间到后,这些缓存同时失效,请求全部转发到DB,DB可能会压力过重。
前段时间我在网上也刚好看到了相关的文章,引用其中的一个简单方案就时讲缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
第二、第三个问题其实差不多,主要就时第二个问题时针对同一个缓存,第三个问题时针对很多缓存
分享到:
相关推荐
提供了解redis实践开过程中,所面对缓存雪崩 缓存穿透 缓存并发的处理方案,同时这些个问题也是面试的经典问题,有助提升开发者的知识视野
什么是redis缓存穿透 雪崩 ,如何应对解决 redis缓存穿透 雪崩 的解决办法 redis缓存穿透的解决办法 redis雪崩的解决办法
面试中缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级怎么解答 面试中缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级怎么解答 面试中缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级怎么解答
redis缓存雪崩,redis缓存穿透,redis缓存击穿 redis应对高并发造成的雪崩、穿透、击穿
Redis系统学习之缓存穿透,缓存击穿,缓存雪崩的概念及其解决方案.docx
Redis 缓存穿透的处理(缓存空值) Redis缓存击穿处理(互斥锁与逻辑删除方案) 封装为工具类,并适用于所有需要进行缓存穿透、击穿的方案,采用了泛型以及Lambda 函数式编程来完成编码
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,...
缓存穿透、缓存击穿、缓存雪崩的描述
二、缓存穿透,缓存击穿和缓存雪崩 缓存穿透 描述:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1024”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致...
前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并
如何设计缓存系统:缓存穿透,缓存击穿,缓存雪崩解决方案分析.docx
Redis高级使用-缓存架构、缓存穿透、缓存雪崩
缓存击穿:某一个热点数据,缓存中某一时刻失效了,因而大量并发请求打到数据库上,像被击穿了一样。就是某个数据,数据库有,但是缓存中没有。 缓存雪崩:指的是大面积的 key 同时过期,导致大量并发打到我们的数据库...
Redis缓存穿透,缓存击穿,缓存雪崩面试题解析
缓存穿透,缓存击穿,缓存雪崩解决方案分析.docx
Redis缓存穿透缓存雪崩缓存击穿的原因和解决方案.docx
缓存穿透,缓存击穿和缓存雪崩的区别以及解决方案.docx
常见的缓存穿透,缓存击穿,缓存雪崩解决方案分析.docx
缓存雪崩,缓存穿透,缓存击穿出现的原因及解决方案.docx
redis缓存穿透穿透解决方案-布隆过滤器.docx