什么是缓存雪崩数据库
若是缓存集中在一段时间内失效,发生大量的缓存穿透,全部的查询都落在数据库上,形成了缓存雪崩。 因为原有缓存失效,新缓存未到期间全部本来应该访问缓存的请求都去查询数据库了,而对数据 库CPU和内存形成巨大压力,严重的会形成数据库宕机
你有什么解决方案来防止缓存雪崩?数组
加锁排队缓存
首先多个请求同时缓存,若是有数据直接返回;没有的话其中一个线程获取锁去访问数据库,查到数据,回设缓存,释放锁,而后其余请求直接取缓存里的数据
数据预热服务器
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就能够避免在 用户请求的时候,先查询数据库,而后再将数据缓存的问题!用户直接查询事先被预热的 缓存数据!能够经过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触 发加载缓存不一样的key
双层缓存策略(不多使用)数据结构
C1为原始缓存,C2为拷贝缓存,C1失效时,能够访问C2,C1缓存失效时间设置为短时间,C2设置为长期。 定时更新缓存策略失效性要求不高的缓存,容器启动初始化加载,采用定时任务更新或移除缓存 设置不一样的过时时间,让缓存失效的时间点尽可能均匀
什么是缓存穿透?并发
缓存穿透是指用户查询数据,在数据库没有,天然在缓存中也不会有。这样就致使用户查询的时候,在缓存中找不到对应key的value,每次都要去数据库再查询一遍,而后返回空(至关于进行了两次 无用 的查询)。这样请求就绕过缓存直接查数据库
你有什么解决方案来防止缓存穿透?函数
采用布隆过滤器BloomFilter线程
将全部可能存在的数据哈 希到一个足够大的 bitmap 中,一个必定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力
缓存空值3d
若是一个查询返回的数据为空(不论是数据不存在,仍是系统故障)咱们仍然把这个空结果进行 缓存,但它的过时时间会很短,最长不超过五分钟。经过这个直接设置的默认值存放到缓存, 这样第二次到缓冲中获取就有值了,而不会继续访问数据库
什么是布隆过滤器?code
本质上布隆过滤器是一种数据结构,比较巧妙的几率型数据结构(probabilistic data structure),特色是高效地插入和查询,能够用来告诉你 “某样东西必定不存在或者可能存在”。 相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,可是缺点是其返回的结果是几率性的,而不是确切的。
布隆过滤器为何不使用HashMap?
讲述布隆过滤器的原理以前,咱们先思考一下,一般你判断某个元素是否存在用的是什么?应该蛮多人回答 HashMap 吧,确实能够将值映射到 HashMap 的 Key,而后能够在 O(1) 的时间复杂度内返回结果,效率奇高。可是 HashMap 的实现也有缺点,例如存储容量占比高,考虑到负载因子的存在,一般空间是不能被用满的,而一旦你的值不少例如上亿的时候,那 HashMap 占据的内存大小就变得很可观了。 还好比说你的数据集存储在远程服务器上,本地服务接受输入,而数据集很是大不可能一次性读进内存构建 HashMap 的时候,也会存在问题。
布隆过滤器原理?
布隆过滤器是一个 bit 向量或者说 bit 数组。
当咱们要映射一个值到布隆过滤器时,先经过多个不一样的哈希函数生成多个哈希值,并把对应哈希值的位置设为1。以下:
当咱们再次映射一个值到布隆过滤器
此时5这个位置被映射了两次,此时假设当咱们查询“阿猪”这个值是否存在,返回了四、五、6三个值,结果6这个位置没有被映射过,因此可断定“必定不存在”;再假设咱们查询“阿鸡”,返回了三、四、5三个值,此时也不能够判断为存在,只能说明“可能存在”。