Redis缓存失效以及解决方案

一、缓存穿透

缓存穿透是指缓存和数据库中都没有数据,用户不断请求不到数据,这时请求就越过redis直接访问数据库,造成数据库访问量压力过大

解决方案:

缓存空对象

过滤器(布隆)

mvc拦截

二、缓存雪崩

缓存雪崩就是在设置缓存的时候,redis中的key设置了相同的过期时间,导致缓存在某一时间同时失效了,请求全部访问数据库,造成数据库压力过大,导致雪崩

解决方案

将缓存数据的过期时间设置为随机,防止同一时间大量数据过期

分布式部署的情况下,将热点数据均匀分布在不同的缓存数据库中

设置热点数据永不过期

出现雪崩进行服务降级,熔断

三、缓存击穿

  1. 缓存击穿和缓存雪崩的区别

缓存击穿是指并发查同一条数据,指的是缓存中没有数据,但是数据库中有数据。这是由于并发用户特别多,同时读缓存没有读取到数据,又同时去数据库查询,引起数据库压力瞬间增大

缓存雪崩是不同的数据都过期了,很多数据都查不到从而查数据库

解决方案

设置热点数据永不过期

加锁,比较常用的做法是mutex(互斥锁),在缓存失效的时候,不立即去读取数据库,而是先试用缓存工具的某些带成功操作返回值的操作

加synchronized(this)锁的问题

会造成时序问题

时序问题:之前的逻辑是查缓存没有然后竞争锁查数据库,这样就会造成多次查库

加synchronized(this)的解决方案

竞争到锁之后,再次确认缓存中有没有,再去查数据库

你可能感兴趣的:(redis)