前言:整理了下项目中用到和设计的redis 缓存穿透、缓存击穿、缓存雪崩?:1:数据实时性要求不高,考虑加一道本地缓存区,定时更新区内数据;
2:归根的问题就是缓存数据压力放到了db,如何解决压力转移,就是问题本质
缓存穿透是指缓存服务器中没有缓存数据,数据库中也没有符合条件的数据,导致业务系统每次都绕过缓存服务器查询下游的数据库,缓存服务器完全失去了其应用的作用。
解决办法:
缓存空值:
布隆过滤器(Bloom Filter)。
缓存击穿是指当某一key的缓存过期时大并发量的请求同时访问此key,瞬间击穿缓存服务器直接访问数据库,让数据库处于负载的情况。
解决办法:
异步定时更新
某一个热点数据的过期时间是1小时,那么每59分钟,通过定时任务去更新这个热点key,并重新设置其过期时间。
互斥锁
在缓存处理上,通常使用一个互斥锁来解决缓存击穿的问题。简单来说就是当Redis中根据key获得的value值为空时,先锁上,然后从数据库加载,加载完毕,释放锁。若其他线程也在请求该key时,发现获取锁失败,则先阻塞。
缓存雪崩是指当大量缓存同时过期或缓存服务宕机,所有请求的都直接访问数据库,造成数据库高负载,影响性能,甚至数据库宕机。
解决办法:
不同的过期时间 :为了避免大量的缓存在同一时间过期,可以把不同的key过期时间设置成不同的, 并且通过定时刷新的方式更新过期时间。
集群: 采用集群方式部署,使用集群可以避免服务单点故障。