`
fantaxy025025
  • 浏览: 1328885 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

缓存穿透、缓存并发、缓存失效之思路变迁

 
阅读更多

缓存穿透、缓存并发、缓存失效之思路变迁

from:http://www.jianshu.com/p/d96906140199

 

我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题:

  • 缓存穿透
  • 缓存并发
  • 缓存失效

一、缓存穿透


Paste_Image.png

Paste_Image.png

Paste_Image.png

注:
上面三个图会有什么问题呢?

我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了。

那这种问题有什么好办法解决呢?

要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
有一个比较巧妙的作法是,可以将这个不存在的key预先设定一个值。
比如,"key" , “&&”。
在返回这个&&值的时候,我们的应用就可以认为这是不存在的key,那我们的应用就可以决定是否继续等待继续访问,还是放弃掉这次操作。如果继续等待访问,过一个时间轮询点后,再次请求这个key,如果取到的值不再是&&,则可以认为这时候key有值了,从而避免了透传到数据库,从而把大量的类似请求挡在了缓存之中。

二、缓存并发

有时候如果网站并发访问高,一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况,如果并发确实很大,这也可能造成DB压力过大,还有缓存频繁更新的问题。

我现在的想法是对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询。

这种情况和刚才说的预先设定值问题有些类似,只不过利用锁的方式,会造成部分请求等待。

三、缓存失效

引起这个问题的主要原因还是高并发的时候,平时我们设定一个缓存的过期时间时,可能有一些会设置1分钟啊,5分钟这些,并发很高时可能会出在某一个时间同时生成了很多的缓存,并且过期时间都一样,这个时候就可能引发一当过期时间到后,这些缓存同时失效,请求全部转发到DB,DB可能会压力过重。

那如何解决这些问题呢?
其中的一个简单方案就时讲缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

我们讨论的第二个问题时针对同一个缓存,第三个问题时针对很多缓存。

总结来看:

1、缓存穿透:查询一个必然不存在的数据。比如文章表,查询一个不存在的id,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成影响。

2、缓存失效:如果缓存集中在一段时间内失效,DB的压力凸显。这个没有完美解决办法,但可以分析用户行为,尽量让失效时间点均匀分布。
当发生大量的缓存穿透,例如对某个失效的缓存的大并发访问就造成了缓存雪崩。

四、大家提问汇总

1、问题1:
如何解决DB和缓存一致性问题?
答:当修改了数据库后,有没有及时修改缓存。这种问题,以前有过实践,修改数据库成功,而修改缓存失败的情况,最主要就是缓存服务器挂了。而因为网络问题引起的没有及时更新,可以通过重试机制来解决。而缓存服务器挂了,请求首先自然也就无法到达,从而直接访问到数据库。那么我们在修改数据库后,无法修改缓存,这时候可以将这条数据放到数据库中,同时启动一个异步任务定时去检测缓存服务器是否连接成功,一旦连接成功则从数据库中按顺序取出修改数据,依次进行缓存最新值的修改。

2、问题2:
问下缓存穿透那块!例如,一个用户查询文章,通过ID查询,按照之前说的,是将缓存的KEY预先设置一个值,,如果通过ID插过来,发现是预先设定的一个值,比如说是“&&”,那之后的继续等待访问是什么意思,这个ID什么时候会真正被附上用户所需要的值呢?
答:我刚说的主要是咱们常用的后面配置,前台获取的场景。前台无法获取相应的key,则等待,或者放弃。当在后台配置界面上配置了相关key和value之后,那么以前的key &&也自然会被替换掉。你说的那种情况,自然也应该会有一个进程会在某一个时刻,在缓存中设置这个ID,再有新的请求到达的时候,就会获取到最新的ID和value。

3、问题3:
其实用redis的话,那天看到一个不错的例子,双key,有一个当时生成的一个附属key来标识数据修改到期时间,然后快到的时候去重新加载数据,如果觉得key多可以把结束时间放到主key中,附属key起到锁的功能。
答:这种方案,之前我们实践过。这种方案会产生双份数据,而且需要同时控制附属key与key之间的关系,操作上有一定复杂度。

4、问题4:
多级缓存是什么概念呢?
答:多级缓存就像我今天之前给大家发的文章里面提到了,将ehcache与redis做二级缓存,就像我之前写的文章 http://www.jianshu.com/p/2cd6ad416a5a 提到过的。但同样会存在一致性问题,如果我们需要强一致性的话,缓存与数据库同步是会存在时间差的,所以我们在具体开发的过程中,一定要根据场景来具体分析,二级缓存更多的解决是,缓存穿透与程序的健壮性,当集中式缓存出现问题的时候,我们的应用能够继续运行。



文/小程故事多(简书作者)
原文链接:http://www.jianshu.com/p/d96906140199
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

 

++

+

0‘’

-

-

-

 

分享到:
评论

相关推荐

    如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题.pdf

    提供了解redis实践开过程中,所面对缓存雪崩 缓存穿透 缓存并发的处理方案,同时这些个问题也是面试的经典问题,有助提升开发者的知识视野

    Redis系统学习之缓存穿透,缓存击穿,缓存雪崩的概念及其解决方案.docx

    ### Redis系统学习之缓存穿透、缓存击穿与缓存雪崩的概念及其解决方案 #### 缓存穿透 **概念**: 缓存穿透是指在高并发场景下,大量的请求访问了一个既不在缓存中也不在数据库中的数据。这种情况通常发生在非法...

    Redis缓存穿透,缓存击穿,缓存雪崩面试题解析

    缓存穿透是指在高并发的情况下,缓存中没有命中的数据直接穿过缓存,直达数据库,导致数据库压力增大,甚至宕机。缓存穿透的原因主要是缓存中没有命中数据,或者缓存数据已经过期或失效。 解决方案: 1. 使用缓存...

    如何应对redis缓存雪崩,redis缓存穿透,redis缓存击穿,redis应对高并发的解决方案

    redis缓存雪崩,redis缓存穿透,redis缓存击穿 redis应对高并发造成的雪崩、穿透、击穿

    缓存穿透、缓存并发、热点缓存之最佳招式.zip

    计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,...

    如何设计缓存系统:缓存穿透,缓存击穿,缓存雪崩解决方案分析.docx

    缓存系统是当前web应用程序中最常用的性能优化手段之一,但是设计一个好的缓存系统需要考虑许多问题,例如缓存穿透、缓存击穿和缓存雪崩等问题。本文将对这些问题进行分析,并提供相应的解决方案。 缓存穿透 缓存...

    缓存雪崩,缓存穿透,缓存击穿出现的原因及解决方案.docx

    缓存穿透则发生在缓存失效时,恶意请求直接穿透缓存访问数据库,导致数据库查询压力剧增,甚至可能对数据库造成损毁。解决缓存穿透的关键在于对请求数据的有效校验和对缓存的合理处理。首先,应对请求参数进行校验,...

    Redis缓存穿透缓存雪崩缓存击穿的原因和解决方案.docx

    Redis缓存穿透、缓存雪崩、缓存击穿的原因和解决方案 Redis缓存穿透、缓存雪崩、缓存击穿是 Redis 缓存中常见的问题,它们可能会导致数据库的负载加大,影响系统的性能。本文将详细讨论这些问题的原因和解决方案。 ...

    Redis高级使用-缓存架构、缓存穿透、缓存雪崩

    Redis高级使用-缓存架构、缓存穿透、缓存雪崩 缓存架构是指将频繁访问的数据存储在高速度的存储介质中,以提高系统的响应速度和性能。在Redis中,缓存架构可以分为多级缓存,包括Redis自身的缓存、内存缓存、磁盘...

    Redis 缓存穿透解决方案与原理.pdf

    2. **解决思路**:介绍如何从设计角度出发,避免或缓解缓存穿透问题。 3. **布隆过滤器原理**:详细讲解布隆过滤器的工作机制,以及如何在项目中应用。 4. **布隆过滤器的局限与优化**:讨论布隆过滤器的误判问题,...

    缓存穿透、缓存击穿、缓存雪崩区别和解决方案1

    缓存击穿则主要发生在高并发环境下,缓存中的热点数据突然过期,而此时大量的并发请求会同时涌向数据库,从而对数据库造成过大压力。为了解决缓存击穿问题,可以将热点数据设置为永不过期,确保这些关键数据始终存在...

    缓存穿透,缓存击穿,缓存雪崩解决方案分析.docx

    大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。 2. 在原有的失效时间基础上增加一个随机值,比如 1-5 分钟随机,这样每一个缓存的过期...

    Redis 缓存穿透、缓存击穿工具类资源

    Redis 缓存穿透的处理(缓存空值) Redis缓存击穿处理(互斥锁与逻辑删除方案) 封装为工具类,并适用于所有需要进行缓存穿透、击穿的方案,采用了泛型以及Lambda 函数式编程来完成编码

    Redis缓存穿透,缓存击穿和缓存雪崩

    1. **热点数据永不过期**:设置关键数据的缓存永不过期,避免因缓存失效而引发的大规模数据库查询。 2. **使用互斥锁**:当缓存未命中时,使用分布式锁确保只有一个线程去加载数据库数据,其他线程等待并重试获取...

    缓存穿透,缓存击穿和缓存雪崩的区别以及解决方案.docx

    缓存击穿是指数据库原本有得数据,但是缓存中没有,一般是缓存突然失效了,这时候如果有大量用户请求该数据,缓存没有则会去数据库请求,会引发数据库压力增大,可能会瞬间打垮。解决方案包括: 1. 如果是热点数据...

    Redis使用-缓存穿透,雪崩,击穿以及解决方案分析.docx

    缓存击穿是指一个 Key 非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个 Key 在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。 解决方案我们的...

    Java模拟并解决缓存穿透问题

    缓存穿透只会发生在高并发的时候,就是当有10000个并发进行查询数据的时候,我们一般都会先去Redis里面查询进行数据,但是如果Redis里面没有这个数据的时候,那么这10000个并发里面就会有很大一部分并发会一下子都去...

    缓存穿透,击穿,雪崩以及解决方案,干货满满.docx

    缓存穿透是指请求的数据在数据库中也不存在,导致每次请求都会穿透缓存直接查询数据库,这可能导致数据库被大量无用的请求压垮。解决方案包括: - **空值缓存**:即使查询结果为空,也将空值缓存起来,设置较短的...

    15-缓存的使用姿势(三):缓存穿透了怎么办?_For_group_share1

    当用户请求的数据在缓存中不存在,数据库中也同样不存在,这样的查询就会穿透缓存直接访问数据库。这种情况可能由用户ID不存在、查询异常等原因引起。例如,尝试查询一个未注册用户的资料,由于用户不存在,缓存和...

    【redis】缓存穿透的解决方案.docx

    缓存穿透是一个常见的问题,在高并发的情况下,可能会导致数据库宕机。缓存穿透是指在缓存中没有查到数据,而去数据库去查询。如果大量的访问数据库则是有问题的,如 2/8 原则,百分之 20 是重要的数据,百分之 80 ...

Global site tag (gtag.js) - Google Analytics