欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
缓存穿透
 
指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。
 
出现原因
 
自身业务代码或者数据出现问题
 
恶意的请求会故意查询不存在的 key
 
解决方案
 
查询返回的数据为空,仍把这个空结果进行缓存,但过期时间会比较短;
 
布隆过滤器:将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对 DB 的查询。
 
布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
 
缓存雪崩
 
当缓存服务器重启或者设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到 DB,DB 瞬时压力过重雪崩。
 
出现原因
 
缓存服务器宕机\缓存服务器重启
 
大量缓存超时时间相同,在同一时间段失效(大批key失效/热点数据失效)。
 
解决方案
 
不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀。比如可以在原有的失效时间基础上增加一个随机值,比如 1-5 分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
 
在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待。
 
采用多级缓存,本地进程作为一级缓存,redis作为二级缓存,不同级别的缓存设置的超时时间不同,即使某级缓存过期了,也有其他级别缓存兜底
 
缓存击穿
 
对于设置了过期时间的 key,缓存在某个时间点过期的时候,恰好这时间点对这个 Key 有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。
 
出现原因
 
某个热点key在某个时间点过期,恰好该时间点对这个key有大量并发的请求。
 
解决方案
 
使用互斥锁:当缓存失效时,不立即去 load db,先使用如 Redis 的 setnx 去设置一个互斥锁,当操作成功返回时再进行 load db 的操作并回设缓存,否则重试 get 缓存的方法。
 
永远不过期:物理不过期,但逻辑过期(后台异步线程去刷新)。
 
从缓存层面来看,确实没有设置过期时间,所以不会出现热点key过期后产生的问题,也就是“物理”不过期。
 
从功能层面来看,为每个value设置一个逻辑过期时间,当发现超过逻辑过期时间后,会使用单独的线程去更新缓
 
小结
 
缓存雪崩与缓存击穿的区别:缓存雪崩是针对很多key,缓存击穿是针对某一个key的缓存。

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h65247.shtml