缓存穿透是指查询一个必定不存在的数据,因为缓存不会命中,须要从数据库查询,查不到数据则不写入缓存,这将致使这个不存在的数据每次请求都去数据库查询,形成缓存穿透。web
对全部可能查询的参数以hash形式存储,在控制层进行校验,若不符合查询条件则丢弃。或者采用布隆过滤器,将全部可能存在的数据哈希到一个足够大的bitmap中,一个必定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。redis
采用一个更为简单粗暴的方法,若是一个查询返回的数据为空,把这个空结果进行缓存,而后对这个数据设置过时时间,但它的过时时间会很短,最长不超过五分钟。数据库
若是缓存集中在一段时间内失效,发生大量的缓存穿透,全部的查询都落在数据库上,则形成了缓存雪崩。后端
在缓存失效后,经过加锁或者队列来控制读数据库写缓存的线程数量。好比对某个key只容许一个线程查询数据和写缓存,其余线程等待。缓存
能够给缓存设置过时时间时加上一个随机值时间,使得每一个key的过时时间分布开来,不会集中在同一时刻失效。并发
设置二级缓存 : A1为原始缓存,A2为拷贝缓存,A1失效时,能够访问A2,A1缓存失效时间设置为短时间,A2设置为长期。异步
缓存不过时:svg
对于一些设置了过时时间的key,若是这些key可能会在某些时间点被超高并发地访问,是一种很是“热点”的数据。这个时候,须要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是不少key。
缓存在某个时间点过时的时候,刚好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过时通常都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。高并发
加互斥锁:
同本文缓存雪崩-方案一.net
永远不过时:
同本文缓存雪崩-方案四
做者Redis系列文章大全
Redis入门
CentOS-7下安装redis-2.8
Redis配置详解
Redis数据淘汰策略
Redis缓存一致性问题
Redis穿透与雪崩的预防与解决方案
阻塞IO、非阻塞IO和异步IO
Redis事物探秘
Redis持久化浅析
IO多路复用及select、poll和epoll
Redis集群-主从复制模式
Redis集群-哨兵模式