一、缓存的处理流程
1.一般的请求过程是:
graph LR
A[客服端] -- 请求--> B{服务器}
B--查询-->C((数据库))
为了缓解数据库的压力,就需要设置缓存,可以使用redis来进行缓存
2.有缓存的请求过程
graph LR
A[客服端] -- 请求--> B{服务器}
B--3.查询-->C((数据库))
B--1.先查询-->D((缓存))
D--2.查询结果为null-->B
C--4.返回查询结果-->B
B--5.将查询结果存入缓存中-->D
只有当缓存中数据不存在时,才会查询数据库,然后再将数据存入缓存中,下次再查询时,就会从数据库中查询了,这样就可以减轻了数据库服务器的压力
二、缓存穿透
一般都是恶意攻击才会发生的。
1.描述
当用户访问一个缓存中没有,数据库中也没有的数据,那服务器拿到这个请求之后,就会先访问缓存服务器,再访问数据库,但是并没查询到数据,就没有向缓存中存入数据,这时如果用户一直大量地发出这个请求,就会增大数据库和缓存的压力。
2.解决方法
- 在服务器对请求的数据进行校验。例如查询成绩,就需要加一个接口,用来判断要出的成绩是否在0~100的范围,如果不在,就直接返回null,减少不必要的查询。
- 在缓存服务器设置一个空数据。当在数据库中也查询不到数据时,直接在缓存中存入一个key-null的数据,当下次再查询这个数据时,就会直接在缓存中查询出一个null数据返回。
三、缓存击穿
1.描述
当缓存中的一个数据的过期时间到了(因为缓存一般都是存储在内存中的,为了节省内存,一般都设置一个过期时间)这时又有大量的用户同时对这个数据进行访问,因为缓存中没有这个数据,就会导致数据库的压力瞬间变大。
2.解决方法
- 不对热数据设置过期时间。就是常用的数据不设置过期时间,让缓存一直有这个数据。
- 在服务器设置一个自动更新的时间。举个例子,在缓存中给一个数据设置过期时间为30分钟,那在30分钟之后,就对这个数据进行更新。
- 对访问数据库的方法加锁。同一时间,只有一个用户能够访问到数据库,这可以极大的降低数据库的压力。
四、缓存雪崩
1.描述
当缓存中的大量数据的过期时间在同一时刻都到了,这时又有很多用户同时访问这些数据,就会导致数据库压力瞬间增大。
2.解决方法
- 设置过期时间时使用随机值。当数据的过期时间随机值时,就会极大地减少了数据同时过期的可能性。
- 分布式结构的话,可以将数据缓存到多地。当数据缓存到多个缓存服务器中时,缓存中的数据同时过期的概率也会极大的降低。
- 可以使用缓存击穿中的解决方法。
五、总结
缓存穿透一般是在缓存中没有数据时才会发生,缓存击穿和缓存雪崩一般是在缓存中的数据的过期时间到了才会发生,而缓存击穿是一个数据过期了,大量用户同时访问;缓存雪崩是大量的数据过期了,大量的用户同时访问不同数据。
最后用一个比较浅显的例子来作为本文的结束吧。
数据库就像我们的身体,缓存就像防弹衣。
当子弹射向我们时,防弹衣里面都是空的(缓存中没有数据)子弹就只能打在我们身上。
当子弹射向我们时,我们正好在更换防弹衣(缓存中的数据过期时间到了)子弹就只能打在我们身上。
我们在解决这些在缓存上发生的问题的目的,就是为了保护数据库。
——————————————————————————————
如果本文章内容有问题,请直接评论或者私信我。
未经允许,不得转载!