缓存雪崩和缓存穿透

缓存雪崩

缓存雪崩可能是因为数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。

解决思路:

1、分析用户行为,尽量让失效时间点均匀分布。避免缓存雪崩的出现。
2、如果是因为某台缓存服务器宕机,可以考虑做主备。
3、在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
4、做二级缓存,或者双缓存策略。A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。

缓存穿透

缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库中查询。大并发的缓存穿透会导致缓存雪崩。

解决思路:

1、如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库,这种办法最简单粗暴。
2、根据缓存数据Key的规则。如果不符合规则就过滤掉,这样可以过滤一部分查询。在做缓存规划的时候,Key有一定规则的话,可以采取这种办法。这种办法只能缓解一部分的压力,过滤和系统无关的查询,但是无法根治。
3、采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的BitSet中,不存在的数据将会被拦截掉,从而避免了对底层存储系统的查询压力。关于布隆过滤器,详情查看:基于BitSet的布隆过滤器(Bloom Filter) 。

Bloom Filter(布隆过滤器)
看下面的问题:
1.检查一个单词是否拼写正确->看它是否在已经字典中
2.网络爬虫->一个网址是否访问过
3.邮件过滤,建立那些发垃圾邮件的地址的黑名单**

你可能会说哈希表不就行了吗,但在2,3的问题中,网页和垃圾邮件地址全球动不动便是几十亿那,哈希的存储效率也就50%左右。

一亿Email(一个占16字节)约为1.6GB内存,要是几十亿个地址就几百GB。 需要少花点内存来工作: 于是布隆过滤器来了,只要12.5%到25%的哈希表空间就能干这事。

工作原理
一亿Email => 16亿二进制(bit)==2亿字节(哈希就是16亿字节了)

猜你喜欢

转载自blog.csdn.net/sinat_37138973/article/details/79540158