昨天第一次听涛哥讲到缓存穿透与缓存雪崩 网上百度学习了下 Mark一下
【缓存穿透】
缓存穿透其实就是查询一个肯定不存在的数据,每次都会查询数据库,由于数据不存在,也不会写缓存。
这样其实是失去了缓存的意义了。
高并发的时候对数据库的压力就大了~~
网上查到有几种解决方法:
1.布隆过滤器--这个算法有点复杂,具体应用就是,高效地检索一个元素是否在一个集合中,但是可能存在低概率的误差。
参见【http://www.dataguru.cn/thread-481958-1-1.html】
这里提到的应用场景和工作原理,可以很好的帮助我们理解。
2.对不存在的数据,即使为空也记录到缓存,只不过设置一个较短的失效时间。
3.对不存在的数据,预置一个固定值,比如&&。第一次过来查询到数据不存在,设置key=&&;
业务侧需要知道当返回&&的时候表示数据不存在。
【缓存雪崩】
比如缓存系统挂了,或者我们设置缓存失效的方式是定时将所有缓存失效的;
当缓存失效的时候,如果有并发请求过来,这个时候都去查询数据库而导致数据库压力过大,同时还需要将结果写到缓存中,写的时候如果没有锁机制,还可能存在重复写的问题。
网上查到有几种解决方法:
1.用加锁或者队列的方式保证缓存的单线 程(进程)写
2.缓存失效机制,比如可以对每个key分别设置缓存失效时间
3.设计一种缓存过期机制,将各个客户端的数据失效时间均匀地分布在时间轴上,没看到具体方法,来自:【http://www.cnblogs.com/AloneSword/p/3931905.html】
【MARK一下缓存算法】摘自【https://my.oschina.net/huangcongmin12/blog/692783】
FIFO算法:First in First out,先进先出。
原则:一个数据最先进入缓存中,则应该最早淘汰掉。也就是说,当缓存满的时候,应当把最先进入缓存的数据给淘汰掉。
LFU算法:Least Frequently Used,最不经常使用算法。
LRU算法:Least Recently Used,近期最少使用算法。
LRU和LFU的区别。LFU算法是根据在一段时间里数据项被使用的次数选择出最少使用的数据项,即根据使用次数的差异来决定。而LRU是根据使用时间的差异来决定的。