缓存存在的一些问题
缓存穿透
缓存穿透,指的是某些情况下,大量对于同一个数据的访问,经过了缓存屏障,但是缓存却未能起到应有的保护作用。
缓存穿透实例
查询一些数据库中没有的数据,这样就不会缓存,每次都去查询数据库。
某个数据尚未被缓存时,并发发送大量同一数据的请求,那么这些请求可以同时到数据库层。
缓存穿透解决方案
控制流量,限制对于同一数据同一时间的访问量。
缓存预热,主动将缓存填充好。
缓存雪崩
原本起到屏障作用的缓存,如果在一定时间段内,对于大量的请求访问失效,即失去了屏障系统,造成它后方的系统压力过大,引起系统过载、宕机的问题。
缓存雪崩实例
机房断电导致缓存失效,于是大量请求冲击数据库导致宕机。
缓存集中在某个时间段集体过期,请求就都会落到了数据库上。
缓存雪崩解决方案
限流,只接纳能够承载的量。
预热,主动往内存中加载一定的热点数据。
避免缓存结束时间太过集中,让它们可以均匀的过期。
缓存容量失控
缓存容量失控实例
将数据暂时存到一个链表中,每十分钟集中写入数据库,并清空链表。
如果短时间内出现大量事件,链表会变得非常大。缓存容量不可控。
清空链表任务的行为首先是个异步行为,而且执行过程中可能会出现异常。
缓存容量失控解决方案
需要基于容量本身来直接控制。
LRU 缺陷
LRU 指的是最少最近使用算法,是缓存队列最常见的算法。
LRU 的原理是维护一个限定最大容量的队列,队列头部总是放置最近访问的元素,而超过容量限制的元素将会被淘汰。
LRU 缺陷实例
某段时间突然缓存和很多冷门的数据,导致一些热门数据超出容量限制被淘汰。这时候大量热门数据的请求同时到来,在没有缓存的情况下直接访问数据库。
LRU 缺陷解决方案
LRU-K 算法:主缓存队列排的是第K次访问的元素,如果访问次数小于K,会在另外一个低级队列中维护。保证了只有达到一定访问量才能被送到主 LRU 队列中去。
缓存框架
集成方式
编程方式
方法注解
配置文件的注入
Web 容器的 Filter
页面模板中的 Cache 标签
核心要素
缓存数据的生命周期管理
数据变动规则
核心 API
用户侧 API
网友评论