缓存击穿:某个key在某个时间刚好失效。
解决缓存击穿思路:首先加锁,限制所有的请求怼到数据库,(加分布式锁)JVM里的锁机制去实现。
限流:hystrix 、nginx
做分布式锁的解决方案:
redis、redission、zookeeper
缓存穿透:大量的访问缓存当中不存在的key
如何解决缓存穿透:
海量数据场景中,如何判断缓存中的key是否存在?
场景一:网页爬虫对UR地址去重,避免爬取相同的URL地址(全球将近6亿网站)。
场景二:反垃圾邮件,从数十亿个(约60亿)垃圾邮件列表中判断某邮箱是否垃圾邮箱。
核心问题点:在于快读判断一个数据是否在海量数据当中存在
解决缓存穿透的方案:
布隆过滤器:能够快速的判断一个元素是否在一个集合,其核心是一个超大的二进制向量(位数组)和几个哈希函数实现快速定位,是一个空间效率,查询效率很高的概率型算法。
缺点:1.有一定的误判率 2.数组删除困难
布隆过滤器实现:Google的guava包版本>19
误差率产生的原因:哈希碰撞。向量的长度越长,误差率越小。
布隆过滤器原理(自行百度)
缓存雪崩:大量的key缓存集中在某一个时间段失效,造成所有的请求Load到DB,给DB带来巨大的压力,甚至可能造成DB服务挂掉
怎么避免?
1.不同的key设置不同的过期时间,让缓存失效时间尽量均衡。
2.通过加锁请求Load到DB的数量,同一时刻只允许一个请求数据库写缓存。