缓存过期与一致性,缓存雪崩,缓存穿透

缓存使用带来的一致性问题 ---- 数据同步,有四类方式

(1)要求高的场景下,使用实时更新策略----- 即数据有变化时,更新的线程直接同步缓存数据

(2)如果允许,可以单独架设第三方方案,来同步缓存数据,常见的有 发布订阅/MQ方式

(3)容忍度较高的场景,可使用缓存过期策略 --- 允许数据短期不一致

(4)定时任务,适合数据变化特别不频繁的情况下,如统计型的数据

缓存过期与一致性,缓存雪崩,缓存穿透_第1张图片

缓存过期与一致性,缓存雪崩,缓存穿透_第2张图片

缓存雪崩

解决办法:加锁排队. 限流-- 限流算法. 1.计数 2.滑动窗口 3.  令牌桶Token Bucket 4.漏桶 leaky bucket [1]

对于上述缓存同步方案的第三种,失效策略,存在雪崩风险:

即某个key失效时,外围刚好有大并发请求到达,若放任大并发传递到mysql,会大概率造成mysql宕机

此时需要对数据库的查询操作,加锁 ---- lock (因考虑到是对同一个参数数值上一把锁,经处synchronized机制无法使用)

加锁的标准流程代码如下:

缓存过期与一致性,缓存雪崩,缓存穿透_第3张图片

缓存过期与一致性,缓存雪崩,缓存穿透_第4张图片

缓存穿透

当外界有恶意攻击时,会向我们请求不存在的数据。因这个数据肯定不会在缓存中存在,故一定会抵达我们的mysql

此时mysql查询将不堪重负,解决办法,使用布隆过滤器

缓存过期与一致性,缓存雪崩,缓存穿透_第5张图片

(1)布隆过滤器的使用方法,类似java的SET集合,只不过它能以更小的内存,存储更大的数据

 类似以下伪代码

SET set = new HashSET();  //创建布隆过滤器

初始化加载业务数据

set.add(id)

查询

query(id){

         set。contain(id)==true ---》 去查数据库

}

(2)对应的生产代码,使用如下:

缓存过期与一致性,缓存雪崩,缓存穿透_第6张图片

缓存过期与一致性,缓存雪崩,缓存穿透_第7张图片

 

 

 

 

 

 

你可能感兴趣的:(缓存)