缓存穿透,缓存雪崩,缓存并发处理策略

缓存通常使用方式是先查询缓存,缓存没有再查询数据库,数据库有则设置进缓存。

使用缓存主要是降低数据库的读压力,保护数据库,假如出现以下场景就可能导致压力全压在数据库上导致数据库服务挂掉。

场景

1.遭受攻击大量随机生成的key访问,或是真正访问但数据库就是没数据

2.上线前没有进行老数据缓存预加载,大量老数据请求去查询数据库

3.热点key失效,对热点key的并发访问大

4.缓存失效,过期时间设置相同同一时间有大量key失效

5.缓存挂掉,直接查数据库

分析:

如果是新业务上线没有旧数据,来一条数据写一条到数据库并同步到缓存

过期时间设置(永不过期):

场景解决方案:

1.由于没有旧数据基本能够保证正常要读的数据都在缓存中,只有更新数据前删除缓存的那一短暂时刻才会出现缓存中不存在,需要去数据库中读取的情况,在这种业务场景下如果从缓存读不到值,可以短暂的休息两秒再去从缓存读取(更新线程会设置成功),如果还读不到(应该就是恶意攻击)即刻返回,避免从数据库中查询。

2.不存在旧数据,因此不存在这种情况。

3.因为永不过期不存在此情况,在更新数据前会有短暂不存在,休息两秒再次读取。

4.因为永不过期不存在此情况

5.采用降级熔断措施

过期时间设置(有过期时间):

场景解决方案:

1.因为无法分辨正常访问还是攻击,过载只能降级处理,或按比例透过请求,数据库没有查询到的存空值到缓存,如果是恶意攻击的会有大量垃圾数据,如果是真正访问但数据库就是没数据则此方式有效,为了防止垃圾占用时间过长,设置比较短的过期时间

2.因为无法分辨老新还有是否是攻击,处理方式同1,只不过此时老数据能查询到数据,对于有数据的设置较长的过期时间。

3.使用分布式锁,只让一个线程去加载数据

4.缓存过期时间设置不同,太大量也要做降级处理

5.采用降级熔断措施

如果业务上线前有旧数据并且没有提前加载到缓存

过期时间设置(永不过期):

场景解决方案:

1.由于有数据只存在数据库而没存在缓存中,因此无法分辨是攻击还是正常请求,如果访问量巨大只能降级或熔断,查询不到的数据向缓存中设置空值并设置较短的过期时间,根本的解决方案是启动任务将没有放入缓存中的数据放到缓存中。

2.同1无法分辨是老数据还是攻击

3.热点key提前加载,使用分布式锁,只让一个线程去加载数据(更新缓存前删除那一霎那)

4.不存在过期,因此不存在这种情况

5.降级熔断

过期时间设置(有过期时间):

场景解决方案:

1.因为无法分辨正常还是攻击,过载只能降级处理,按比例透过请求,数据库没有的存空值,如果是恶意攻击的会有大量垃圾数据,如果是真正访问但数据库就是没数据则此方式有效,为了防止垃圾占用时间过长,设置比较短的过期时间

2.无法分辨是请求老数据还是攻击,处理方式同1,只不过此时能查询到数据,对于有数据的设置较长的过期时间。

3.分布式锁,只让一个线程去加载数据

4.缓存过期时间设置不同,太大量也要做降级处理

5.采用降级熔断措施

其中场景1,2叫做缓存穿透,即访问数据库中根本没有的值。

场景3叫做缓存并发或者热点key失效

场景4叫做缓存雪崩

对于经常使用但变化很少的key要设置为永不过期,如果业务量小,建议尽可能多的设置为永不过期,放一次缓存多麻烦,既然都放里了为什么要让他过期。但是对于访问量大的业务,还是要合理设置过期时间,不然缓存爆调压力还是到库。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180113G0ELQL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券