Redis缓存问题
正常缓存流程
用户访问网站,网站服务器请求Redis查询数据,Redis中有数据就直接返回,若Redis中没有数据,服务器再请求MySQL查询,MySQL查询到数据写入Redis,并返回。
缓存雪崩
网站访问量大,Redis中大量的key在同一时间全部失效,导致这些key对应的用户请求全部集中到MySQL,导致MySQL挂掉。
解决方法:key的失效时间随机设置,使得这些key不会在同一时间失效;Redis集群部署,热点key平均分布在不同节点;定时任务刷新缓存,在缓存失效前重置key的失效时间。
缓存穿透
有非法请求访问网站,请求的数据在Redis和MySQL中都不可能存在,因此该请求穿过Redis再进入MySQL,非法请求量过大,导致MySQL挂掉。
解决方法:提前校验请求参数,使非法请求不会到Redis;MySQL中未查询到数据也写入Redis,下次请求时Redis中有这个key可直接返回;使用布隆过滤器在Redis之前过滤请求。
缓存击穿
网站访问量大且持续时间长,Redis中某一个热点key过了生效时间,失效后针对这个热点key的请求全部集中到MySQL,导致MySQL挂掉。
解决方法:使用分布式锁,使得同一时间只有一个请求线程访问MySQL,其他未抢到锁的线程睡几毫秒后再去访问Redis,此时Redis中就有数据了。
Redis和MySQL缓存一致性问题
数据更新时,如何保证MySQL和Redis数据一起更新?
首先要设置缓存过期时间;
其次,在更新MySQL时,若采用“先删redis再更新mysql”,应使用 延时双删 方法,即更新Mysql后sleep几毫秒再删除redis;还可以采用“先更新Mysql,再删除redis”
Redis删除失败怎么办?
首先redis一定要有过期时间,使其能自动更新,其次可以用kafka或定时任务刷新缓存