1.缓存穿透
缓存穿透:在某些情况下,大量对于同一个数据的访问,经过了缓存屏障,但是缓存却未能起到应有的保护作用。
比如 对于一个key查询,数据库中没有这个数据,就会导致缓存中也没有这个数据的存放,每次请求到来都会去查询数据库,缓存根本起不到应有的作用。
解决方案:
- 缓存预热,在大量请求到来之前,先主动将该缓存填充好。
- 流量控制的方式,限制对于同一数据的访问,必须等到前一个完成以后,下一个才能进行。
2.缓存雪崩
缓存雪崩:原本起到屏障作用的缓存,如果在一定时间段内,对于大量的请求访问失效,即失去了屏障作用,造成它后方的系统压力过大,引起系统过载、宕机等问题,就叫做缓存雪崩。
解决方案:限流和预热。
3.缓存容量失控
缓存容量的控制,最好是基于缓存容量本身来直接控制。
4.LRU的致命缺陷
LRU: Least Recently Used,最少最近使用算法。原理:维护一个限定最大容量的队列,队列头部总是放置最近访问的元素(包括新加入的元素),而在超过容量限制时总是从队尾淘汰元素。
image.png
5.缓存框架
缓存框架主要是2方面,集成方式(编程方式、方法注解、配置文件的注入)和核心要素。
编程方式
使用编程的方式来获取缓存数据。一般使用cache-Aside模式应用。
Cache<String, City> cityCache = cacheManager.createCache("cityCache", CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, City.class, resourcePools));
cityCache.put("Beijing", beijingInfo);
City beijing = cityCache.get("Beijing");
方法注解
@Cacheable(value="getCity", key="#name")
public City getCity(String name) { ... }
配置文件的注入
<mapper namespace="..." >
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
...
</mapper>
web容器的Filter
可以在tomcat中配置过滤器。
页面模板中的cache标签
有一些页面模板支持cache标签或表达式语法,在标签属性或语法参数中可以指定缓存的时间和条件,标签内部的HTML将被缓存起来,以避免在每次模板渲染时都去执行其中的逻辑。
核心要素
要素 1:缓存数据的生命周期管理
要素 2:数据变动规则
要素 3:核心 API
要素 4:用户侧 API
网友评论