2016-03-01 18:56 2615人阅读 评论(0) 收藏 举报mysql
分类:redis
Java(60) sql
缓存雪崩多是由于数据未加载到缓存中,或者缓存同一时间大面积的失效,从而致使全部请求都去查数据库,致使数据库CPU和内存负载太高,甚至宕机。缓存
解决思路:服务器
1,采用加锁计数,或者使用合理的队列数量来避免缓存失效时对数据库形成太大的压力。这种办法虽然能缓解数据库的压力,可是同时又下降了系统的吞吐量。并发
2,分析用户行为,尽可能让失效时间点均匀分布。避免缓存雪崩的出现。spa
3,若是是由于某台缓存服务器宕机,能够考虑作主备,好比:Redis主备,可是双缓存涉及到更新事务的问题,update可能读到脏数据,须要好好解决。.net
缓存穿透是指用户查询数据,在数据库没有,天然在缓存中也不会有。这样就致使用户查询的时候,在缓存中找不到,每次都要去数据库中查询。blog
解决思路:
1,若是查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库,这种办法最简单粗暴。
2,根据缓存数据Key的规则。例如咱们公司是作机顶盒的,缓存数据以Mac为Key,Mac是有规则,若是不符合规则就过滤掉,这样能够过滤一部分查询。在作缓存规划的时候,Key有必定规则的话,能够采起这种办法。这种办法只能缓解一部分的压力,过滤和系统无关的查询,可是没法根治。
3,采用布隆过滤器,将全部可能存在的数据哈希到一个足够大的BitSet中,不存在的数据将会被拦截掉,从而避免了对底层存储系统的查询压力。关于布隆过滤器,详情查看:基于BitSet的布隆过滤器(Bloom Filter)
大并发的缓存穿透会致使缓存雪崩。