缓存穿透、缓存击穿、缓存雪崩、缓存预热、缓存更新、缓存降级
1.缓存处理流程
前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。
2.缓存穿透
- 描述:缓存和数据库中都没有的数据,而用户不断发起请求.
如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大 - 解决方案
- 在接口层增加校验,如果id非常大或者id<=0,我们就阻挡该用户
- 我们也可以将用户缓存和数据库中都取不到的数据设置为null,在此当中还可以设置短点,如30m,如果设置太长可能会导致正常用户的访问,这样可以防止用户用同一个id进行暴力攻击.
3.缓存击穿
-
问题描述
缓存中没有但数据库中有的数据(一般是缓存时间到期),
这时由于并发用户特别多,缓存中没有读取到数据又去数据库中读取导致数据库压力太大. -
解决方案
- 将比较热点的数据延长过期时间或者设置为永不过期
- 加互斥锁:
1]缓存中有数据就直接返回结果
2]缓存中没有数据,第一个进入线程并且获取锁从数据库中读取数据,没有释放锁之前其他并行的线程会等待100ms,再重新去缓存中获取数据,这样就防止都去数据库中重复读取数据,重复往缓存中更新数据的情况.
3]如果能根据key值加锁就更好了.就是线程A从数据库取key1的数据并不妨碍线程B取key2的数据.
4.缓存雪崩
-
问题描述
缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机。
和缓存击穿不同的是:缓存击穿是并发查询同一条数据,而缓存雪崩是很多不同的数据都过期了,缓存中找不到相应的数据需要去数据库中查询 -
解决方案
- 为了避免数据同时过期,将数据的过期时间设置为随机.
- 如果缓存数据库是分布式部署的话,我们可以将热点数据均匀存放在不同缓存数据库中
- 设置热点数据永不过期也是可以的.
5.缓存预热
6.缓存更新
7.缓存降级
-
问题描述
-
解决思路