【web面试】缓存相关

缓存穿透、缓存击穿、缓存雪崩、缓存预热、缓存更新、缓存降级

1.缓存处理流程

前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。
在这里插入图片描述

2.缓存穿透

  1. 描述:缓存和数据库中都没有的数据,而用户不断发起请求.
    如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大
  2. 解决方案
  • 在接口层增加校验,如果id非常大或者id<=0,我们就阻挡该用户
  • 我们也可以将用户缓存和数据库中都取不到的数据设置为null,在此当中还可以设置短点,如30m,如果设置太长可能会导致正常用户的访问,这样可以防止用户用同一个id进行暴力攻击.

3.缓存击穿

  1. 问题描述
    缓存中没有但数据库中有的数据(一般是缓存时间到期),
    这时由于并发用户特别多,缓存中没有读取到数据又去数据库中读取导致数据库压力太大.

  2. 解决方案

  • 将比较热点的数据延长过期时间或者设置为永不过期
  • 加互斥锁:
    1]缓存中有数据就直接返回结果
    2]缓存中没有数据,第一个进入线程并且获取锁从数据库中读取数据,没有释放锁之前其他并行的线程会等待100ms,再重新去缓存中获取数据,这样就防止都去数据库中重复读取数据,重复往缓存中更新数据的情况.
    3]如果能根据key值加锁就更好了.就是线程A从数据库取key1的数据并不妨碍线程B取key2的数据.

4.缓存雪崩

  1. 问题描述
    缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机。
    和缓存击穿不同的是:缓存击穿是并发查询同一条数据,而缓存雪崩是很多不同的数据都过期了,缓存中找不到相应的数据需要去数据库中查询

  2. 解决方案

  • 为了避免数据同时过期,将数据的过期时间设置为随机.
  • 如果缓存数据库是分布式部署的话,我们可以将热点数据均匀存放在不同缓存数据库中
  • 设置热点数据永不过期也是可以的.

5.缓存预热

在这里插入图片描述

6.缓存更新

在这里插入图片描述

7.缓存降级

  1. 问题描述
    在这里插入图片描述

  2. 解决思路
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值