概述
前言
随着互联网行业不断的演进与变更,体量与复杂性的变化催生出一个又一个难题,从而衍生出一系列方便开发者解决问题的中间件,比如Redis,我们为什么要使用redis,有两个重要的原因,一个是为了减轻服务器数据库的压力,另一个当然就是因为它很‘快’,本文主要阐述在使用Redis过程中遇到高并发的情况下容易产生的几个问题,缓存击穿,缓存雪崩以及缓存穿透
一、缓存穿透
缓存穿透是指查询一个数据库中不存在的数据,数据库中不存在的数据自然也不会被加载到缓存当中,正常的查询流程应该是,查询一个数据先去缓存中判断这个数据是否存在,存在则返回,如果不存在则去数据库中查询,如果查询数据不为空则放回缓存后返回查询,当数据库中不存在这个数据的时候或者说这个数据已经过期,那么一直请求这个key,这个请求就会一直直接打在数据库查询上,导致数据库压力持续增大直至崩溃,如果有网络攻击者发现这个漏洞后果可想而知。
解决方案:
(1)采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤;
(2)拦截器,id<=0的直接拦截。
(3)利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试
(4)采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。
(5)采取缓存空值的方式,也就是从数据库中查询该key的值为空的情况下也放入缓存当中。
二、缓存击穿
值得是一个存在的key,在缓存失效的那一刻,突然有大量查询请求,那么这些请求都会直接打在数据库上,导致数据库压力骤增,请求量过大导致崩溃,比如网购app中的抢购、秒杀等现象。
解决方案:
(1)设置热点的key在缓存中永不失效。
(2)添加互斥锁
三、缓存雪崩
缓存雪崩指的是大量的key在缓存中设置失效的时间都差不多,导致缓存在同一时间失效,那么所有的请求都会直接打在数据库上,同样会照成数据库压力陡增。
解决方案:
(1)缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
(2)如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。
(3)设置多缓存,主从缓存群等,主缓存失效,立即切换从缓存,确保请求不会直接对数据库照成查询压力。
最后
以上就是迷人店员为你收集整理的缓存穿透、缓存雪崩、缓存击穿的区别和解决方案前言一、缓存穿透二、缓存击穿三、缓存雪崩的全部内容,希望文章能够帮你解决缓存穿透、缓存雪崩、缓存击穿的区别和解决方案前言一、缓存穿透二、缓存击穿三、缓存雪崩所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复