使用redis缓存的目的
1、为了防止大量用户查询直接打到数据库,将数据库打挂;
2、提升查询效率;
如果redis使用不当,会出现一些异常情况,如缓存雪崩、缓存穿透、缓存击穿。
缓存雪崩
什么是缓存雪崩?
redis缓存KV的时候,会指定缓存失效时间。如果在同一时间对缓存KV设置了相同的缓存失效时间,则到失效时间的时候,请求在redis中已经查不到数据,进而直接请求数据库,由于访问数据库请求突然爆发增长,可能打挂数据库,进而导致其他系统的崩溃。缓存集中失效的场景就是缓存雪崩。
如何避免缓存雪崩?
对缓存失效时间加上随机值,避免缓存的集中失效。
缓存穿透
什么是缓存穿透?
请求先从缓存中找数据,但是缓存中该KV不存在,就从数据库中找,但是数据库中也不存在。查询数据库中不存在的请求就是缓存穿透。缓存穿透一般是请求带着非法参数,直接穿过缓存访问到数据库。比如数据库表的主键是从0自增的,但是攻击者拿着主键-1来请求,缓存中肯定不存在,请求就直接访问到数据库了。
如何避免缓存穿透?
1、对请求做合法值校验、权限校验等,让不合法的请求在访问数据库前就被拦截。
2、使用布隆过滤器,布隆过滤器可以判断key是否在数据库中存在,如果不存在就直接返回。
缓存击穿
什么是缓存击穿?
缓存击穿和缓存雪崩有点像,但是又不完全一致。缓存击穿主要是关于热点KV的问题。请求不断访问到热点KV上,如果缓存的热点KV突然失效,大量请求就瞬间访问到数据库上。
如何解决缓存击穿?
1、设置热点数据永不过期;
2、请求缓存后再请求数据库前加锁,在第一次访问数据库后再次将缓存KV加载到redis中;