缓存使用中的三种问题及解决方案
2022/6/27 来源:不详北京看白癜风 https://yyk.39.net/bj/zhuanke/89ac7.html
在互联网应用开发中,几乎所有的功能其本质都是数据的增删改查。而且,大多数情况下,某一个应用的性能瓶颈都是出现在应用程序去操作数据库的这一环。因此,解决掉这一环的瓶颈就显得尤为重要,尤其是对数据库的查询操作,如果能增强对数据的查询效率,那么将会大大提升用户的使用体验。
而使用缓存,是提升数据查询效率的一个最常用,也是最有效的解决方案。但是在使用缓存的过程中,还需要解决一些关于缓存的常见的问题,比如缓存击穿、缓存穿透和缓存雪崩。
如果你应用的用户并不多,可能不需要去考虑这些问题,但是如果你的用户量达到了百万千万级别以后,那就有必要去考虑这些问题了,下面,我们来对缓存击穿、缓存穿透和缓存雪崩分别进行介绍。
缓存穿透
产生原因:
用户一直查询一个数据库本身就并不存在的数据,因为数据数据不存在,所以当然缓存里面也就没有这个数据,那么每一次请求都会去从数据库查询。
下面举个栗子:
我们通过id去查询empolyee员工表,如果前端传的id为一个负数,那么这行数据在数据库里面是肯定不存在的,所以每次请求都会去查询数据库。这种情况下,如果某些别有用心的人通过写脚本的方式大量的通过传一个id为负数来发起这个查询请求的话,很可能就导致数据库库崩掉,那么对于这种情况,我们改如何解决呢?
解决方案:
在后端收到请求以后,对请求的参数进行合法型校验,如果该参数是负数,或者说是一个绝对不可能存在的参数,那么直接向前端响应非法参数异常。这种方案可以解决一部分的非法请求,但是如果请求的参数是合法的,而数据库又确实没有又怎么办呢?这个时候可以把这个数据查询到的空结果同样进行缓存,这样下一次进行查询的时候就直接返回缓存中的空数据,起到保护数据库的作用。
缓存击穿
产生原因
这种情况是属于数据库有数据,但是缓存中没有。当我们把数据放到缓存中时,通常都会给数据指定一个有效时长,如果该数据在过期的一瞬间,刚好有大量请求查询这条数据,那么这些请求就会全部到数据库进行查询,从而导致数据库崩溃。还有一种产生的原因是程序刚刚启动以后,缓存中本来就没有数据。
解决方案:
第一种是直接把这些热点数据设置为永不过期,但这种粗暴的解决方案并不好,因为如果热点数据可能会变化,而且也比较暂用缓存空间。
第二种解决方案就是给查询数据库的代码加上互斥锁,第一个线程来查询的时候,后面的查询线程全部处于等待状态,并且这些等待线程用递归调用当前查询方法的方式进行查询,一旦拿到锁的第一个线程把查询结果放到缓存中以后,后面的线程就可以获取到数据,这样通过互斥锁的方式也起到了保护数据库的效果针对程序刚刚启动以后,缓存中本来就没有数据,可以在程序启动的时候用代码进行一次数据查询操作,提前把数据放到缓存中
缓存雪崩
产生原因
缓存雪崩的原因很简单,就是大量数据在同一时间点过期,导致大量请求到达数据库
解决方案
知道缓存雪崩的原因以后,也不难想出解决方案,即把这些热点数据的过期时间设置成不一样的,尽量不要重复,即可解决缓存雪崩的问题
以上就是今天的分享
如果你也想进入互联网
不妨来源码时代
0元试学14天
零基础也能拿高薪
点击下方