自学内容网 自学内容网

Redis缓存击穿、缓存穿透、缓存雪崩、

缓存击穿

当某一 key 的缓存过期时大并发量的请求同时访问此 key,瞬间击穿缓存服务器直接访问数据库,让数据库处于负载的情况。
解决方案

  • 异步定时更新:某一个热点数据的过期时间是 1 小时,那么每 59 分钟,通过定时任务去更新这个热点 key,并重新设置其过期时间。
  • 逻辑过期:不设置过期时间,在 redis 加载数据库数据时新增过期时间字段,在请求获取数据时若发现数据过期则返回过期数据,同时再更新 redis
  • 互斥锁:当Redis中根据key获得的value值为空时,先锁上,然后从数据库加载,加载完毕,释放锁。若其他线程也在请求该key时,发现获取锁失败,则先阻塞。

缓存穿透

当缓存服务器中没有缓存数据,数据库中也没有符合条件的数据,导致业务系统每次都绕过缓存服务器查询下游的数据库,缓存服务器完全失去了其应用的作用。
解决方案:

  • 缓存空值:为这些 key 对应的值设置为 null 并放到缓存中,这样再出现查询这个 key 的请求的时候,直接返回 null 即可(需要设置失效时间或者适时更新数据)
  • 布隆过滤器:通过将 key 使用多个 hash 算法得出的值存入为数组来确定一个 key 是否存在,它可以告诉你数据一定不存在或可能存在,相比Map、Set、List等传统数据结构它占用内存少、结构更高效。对于缓存穿透,我们可以将查询的数据条件都哈希到一个足够大的布隆过滤器中,用户发送的请求会先被布隆过滤器拦截,一定不存在的数据就直接拦截返回了,从而避免下一步对数据库的压力。

缓存雪崩

当大量缓存同时过期或缓存服务宕机,所有请求的都直接访问数据库,造成数据库高负载,影响性能,甚至数据库宕机。
解决方案:

  • 不同过期时间:为了避免大量的缓存在同一时间过期,可以把不同的 key 过期时间设置成不同的,并且通过定时刷新的方式更新过期时间。
  • redis集群:使用集群避免服务单点故障,提高可用性
  • 降级限流策略:添加降级限流策略,当缓存失效或服务宕机时,及时降低对数据库的访问请求,保护数据库。
  • 多级缓存:对请求的每个环节,添加缓存,降低对 redis 的压力

原文地址:https://blog.csdn.net/u013149491/article/details/135891485

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!