Memcached之缓存雪崩、缓存穿透、缓存预热

本文探讨了缓存系统中的两大挑战:缓存穿透和缓存雪崩现象,解释了它们的发生原因及对后端系统的影响。同时,提出了多种应对策略,包括空结果缓存、过滤无效key、缓存预热等,旨在保障系统的稳定性和效率。

什么是缓存穿透

    一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。
    总结为一句话:去查找的key在DB中不存在,每次都要去DB中查,给DB带来巨大的压力,这就是缓存穿透。

如何避免

1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。【感觉应该用的不多吧】


缓存雪崩现象

    一般是由于某个memcached节点失效,导致其他节点的缓存命中率下降,缓存中缺失的数据就需要去数据库中查询,短时间内,频繁的访问数据库导致数据库服务器承受不住那么大的请求压力而崩溃(换句话说,就是缓存失效导致短时间内访问数据库,数据库承受不住如此大的压力而被一下压垮)。
    重启后,因为缓存为空,数据库服务器再次被压垮,但是会向缓存中写入一些数据;数据库服务器反复多次重启,直到缓存重建完毕,数据库服务器才能成功启动并稳定运行

真实案例:
    假设每秒1200并发,Memcached 周期每6小时失效,由于请求量过多Memcache已满,造成BD奔溃。
解决方案:
1:把缓存设置为随机3到9小时的生命周期,这样不同失效,把工作分配到各个点上去。
2:把缓存时间调长,到凌晨4-5点[人数最少的时候]去更新缓存。

解决思路:

1,采用加锁计数,或者使用合理的队列数量来避免缓存失效时对数据库造成太大的压力。这种办法虽然能缓解数据库的压力,但是同时又降低了系统的吞吐量。
2,分析用户行为,尽量让失效时间点均匀分布。避免缓存雪崩的出现。
3,如果是因为某台缓存服务器宕机,可以考虑做主备,比如:redis主备,但是双缓存涉及到更新事务的问题,update可能读到脏数据,需要好好解决。


缓存预热(热备份)

    当数据量级不大时,可以先开启数据库,当客户端访问的数据不在缓存中,就从数据库中将数据取出并存入缓存,这是可以的。但是,当数据量非常大时,但是初始时缓存中没有内容,假设启动服务器程序后,客户端发来大量的请求,由于缓存中没有内容,大量的请求将会导致服务器查询数据库,使得数据库被击垮。
     ==> 因此,在程序开始之前,先将数据库中的一部分数据(一般指经常访问的数据、访问频率高的热数据)先存到缓存中,然后再开启程序进行服务。这就是缓存预热(热备份)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值