缓存那些事之常见问题与处理方案

作者 : 开心源码 本文共1488个字,预计阅读时间需要4分钟 发布时间: 2022-05-13 共239人阅读

前言

缓存应该是技术人员最常见的一个词了,但是或者许不是所有人都能精确的说出缓存本质是什么,又适用于什么情况,可能遇到哪些问题,应该怎样来处理。下面我就分三篇文章来给大家详细详情下缓存相关的知识。疏漏不足之处,也请指正,不胜感激。

《缓存那些事之初识缓存》
《缓存那些事之缓存升级、失效以及内存淘汰策略》
《缓存那些事之常见问题与处理方案》

缓存问题与处理方案

缓存的确有千般好,可以有效提高我们系统的性能,但是同时也会带来少量问题,假如没有好好解决这些问题,就会给系统带来很多不可控的因素,下面我们来理解下缓存系统常见的问题以及如何来处理。

缓存穿透

缓存穿透是指客户查询的数据在数据库中不存在,这时候自然不会升级到缓存系统中,因而,每次查询这个不存在的数据的时候,我们都需要去数据库去查询,这也就失去了缓存的意义。另外黑客也可能利用这一点来进行攻击,例如频繁使用不存在的key(如非常大的id)来查询我们的应用,这即可能会导致数据库因为压力过大而宕掉。

处理方案

  • 布隆过滤器:通过布隆过滤器把肯定不存在的数据过滤掉,这样查询到我们数据库的就都是可能存在的数据,可以大大减少对数据库的查询压力。但是假如查询的数据是在我们允许的范围内,只是目前还是空值,那布隆过滤器也没办法处理,就需要用后面的方法了。

  • 短缓存空结果:假如一个查询的结果为空,依然把这个空结果进行缓存,但是和正常的数据的缓存时间不同,空结果的缓存时间需要设置得很短,避免后面有数据了之后依然一直缓存着空数据。那么这里大家可能会问了,我设置一个很长的时间,而后新添加数据后让缓存失效不就好了吗?事实上这里即便使用了合适的缓存升级策略也依然应该设置较短的过期时间,由于我们不可能每次新添加数据都去失效缓存。和升级数据不同,升级的时候我们一般需要去让缓存也失效,但是新添加数据的时候,我们大概率不存在对应的空缓存,假如新添加数据的时候也去让缓存失效,就会多出很多不必要的网络请求,所以新添加的时候我们一般不会去让对应的缓存失效。

缓存雪崩

缓存雪崩是指由于某些起因,导致缓存在某一个时间内大规模失效,例如设置了同一个过期时间,或者者缓存服务宕机了,这时候就会有大量的请求直接到数据库上面,数据库瞬时压力过重而挂了。

缓存服务宕机的情况我们这里先不探讨,这个主要是服务的高可用和服务降级的问题。我们来看看另一种情况如何来处理。

处理方案

  • 随机过期时间:在原有过期时间上加上一个随机值,这样过期时间相对随机,避免缓存同时大规模过期。
  • 加锁写缓存:缓存过期时,系统先获取锁,获取成功的才允许读数据库,并写入缓存,其余请求就都返回稍后重试或者者直接sleep一小段时间而后重试原有逻辑。
  • 提前过期:设置缓存的时候,在缓存的数据里加多一个字段,表示提前过期时间,这个过期时间比缓存真正过期的时间短。而后读缓存的时候,假如发现缓存里的提前过期时间到了,就去获取锁,获取到的请求读数据库,并写入缓存,同时升级提前过期时间和缓存过期时间,而其余没有获取到锁的请求就按读到的缓存数据正常往后面走逻辑,不再负责升级缓存。

缓存击穿

缓存击穿和缓存雪崩很像,缓存雪崩是同一时间大量缓存过期,导致数据库压力过大宕机了,而缓存击穿是指某一个热点key过期了,而这时候这个kye又有大量请求过来,就会给数据库带来巨大压力,导致数据库宕机。缓存击穿的处理方案可以采取缓存雪崩的后两个方案,这里就不赘述了。

Enjoy it !

假如觉得文章对你有用,可以资助我喝杯咖啡~

版权公告

转载请注明作者和文章出处
作者: X先生
首发于 https://www.songma.com/p/4ef2a47ad707

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 缓存那些事之常见问题与处理方案

发表回复