Redis缓存失效引发的问题

项目中使用redis作为缓存服务时,当redis中存放的key过期,或者不存在缓存时候可以会引发各种问题:

1.缓存穿透

特指故意构建redis中不存在的key,使请求直接落到数据库层。

解决办法:

1.使用redis构建布隆过滤器,提前将存在的key放入,每次现在过滤器中查找是否存在key,不存在就视为非法的key,不继续进行查找。

2.缓存null值,数据库查询结果为空也缓存在redis,但过期时间要设置短一点。

2.缓存击穿

指redis中某个key过期导致请求落到数据库层,就像在缓存上打了个洞。

解决办法:

1.使用互斥锁。如果redis是单机可以使用synchronized或者lock实现,集群可以使用分布式锁setnx。只允许一个线程去执行查询数据库的操作然后缓存结果,其他线程等待并重试。(我觉得这种方式比使用队列要好)

2.提前预判过期。在value中设置过期时间,比真实的ttl提前一点,这样每次使用redis查询完,判断value中的过期时间是否过期。提前增加ttl的时间。

3.最暴力也是简单的设置key永不过期。

3.缓存雪崩

指redis中部分key集中过期,使大量请求落到数据库层,对数据库造成极大压力,可能压垮数据库。

解决办法:

1.key过期时间生成使用随机因子,不使用相同的过期时间,防止集体过期。