ehcache3的使用

springboot使用

启动类@EnableCaching

方法使用

@Cacheable(cacheNames = "empCache",key = "#id")

钩子实现:

c 复制代码
@EnableCaching
@Configuration
public class CacheConfig {
    /**
     * 配置缓存 
     */
    @Bean
    public CustomerCache redisCache(){
        CustomerCache cache = new CustomerCache ();
        cache.setName("abcCache");
        return cache;
    }
    /**
     * 缓存CacheManager 管理
     */
    @Bean
    public SimpleCacheManager cacheManager(CustomerCache cache){
        Set<Cache> cacheSet = new HashSet<>();
        cacheSet.add(cache);
        SimpleCacheManager manager = new SimpleCacheManager();
        manager.setCaches(cacheSet);
        return manager;
    }
}
    
public class CustomerCache implements org.springframework.cache.Cache {
	void evict(Object key);
	void put(Object key, @Nullable Object value);
	<T> T get(Object key, Callable<T> valueLoader);

}

加载

go 复制代码
URL url = this.getClass().getClassLoader().getResource("ehcache3.xml");
    XmlConfiguration xmlConfiguration = new XmlConfiguration(url);
    CacheManager cacheManager = CacheManagerBuilder.newCacheManager(xmlConfiguration);
    cacheManager.init();
 
c 复制代码
Cache<Integer, String> myCache = cacheManager.getCache("abcCache", String.class, EhcacheData.class);
myCache.get("")

xml配置

java 复制代码
<config
		xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
		xmlns='http://www.ehcache.org/v3'
		xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd">
    <persistence directory="D:\temp"/>

	<cache alias="abcCache">
		<key-type>java.lang.String</key-type>
		<value-type>com.util.EhcacheData</value-type>
		<expiry>
			<!-- 过期策略有三种: 不配置expiry不过期;TTL:指定条目的存活时间; TTI:条目在指定时间段内未被使用,则过期-->
			<tti unit="minutes">60</tti>
		</expiry>
		<resources>
			<!--最多在堆中有多少个条目数,默认只存放在堆内存,未设置默认使用应用的设置-->
			<heap unit="entries">6000</heap>
			<!-- <heap unit="MB">10</heap> -->
            <offheap unit="MB">50</offheap>
            <disk persistent="true" unit="MB">500</disk>
		</resources>
	</cache>
</config>

1、过期策略不直接参与控制内存的使用,仍有可能会超出配置的条目上限或者内存上限。

2、若缓存条目数或者缓存总量达到配置上限后,则按照默认的缓存淘汰策略LRU(移除最近最少使用)

3、若过期策略是TTL(指定条目存活时间),如果一个条目在其TTL内未被再次访问,它会在达到TTL后从缓存中自动删除。当达到缓存配置上限后,即使条目尚未达到其TTL,如果需要释放内存,它可能会被移除;

如果一个条目在TTL期间被频繁访问,即使超过了LRU限制,它也会被保留在缓存中,直到TTL到期或被新的条目替换,这种情况下会超出配置的条目上限或者内存上限。

4、若过期策略是TTI(条目在指定时间段内未被使用),

满足TTI条件从缓存中自动删除。当达到缓存配置上限后,需要释放内存,条目因频繁被访问从而避免了因TTI过期而被移除,会一直占用缓存空间,这中情况下会超出配置的条目上限或者内存上限

5、若过期策略不配置,表示不过期,当达到缓存配置上限后,默认使用LRU删除过多的缓存条目

淘汰策略:

FIFO(First In First Out):先进先出

LFU(Least Frequently Used):最少使用,使用次数最少的条目将被清理

LRU(Least Recenly Used):最近最少使用,最近一段时间内使用次数最少的条目将被清理

xml配置详解
参数
persistence
directory 数据存储目录
cache
alias 缓存组名
key-type 缓存 key 的类型,比如 java.lang.String
value-type 缓存 value 的类型,一般自定义对象,对象有个Object data变量
expiry 缓存过期策略
tti 条目在指定时间段内未被使用
unit 单位,nanos、micros、millis、seconds、minutes、hours、days
ttl 指定条目存活时间
unit 单位,nanos、micros、millis、seconds、minutes、hours、days
resources 资源配置
heap 堆内存配置
unit 单位,默认entries条目总数,B、KB、MB、GB、TB、PB
offheap 堆外内存配置
unit 单位,默认entries条目总数,B、KB、MB、GB、TB、PB
disk 磁盘配置
persistence 是否持久化,默认false
unit 单位,B、KB、MB、GB、TB、PB
相关推荐
Zhou1411364 分钟前
SpringBoot_03_Web开发
前端·spring boot·python
蜗牛互联网40 分钟前
WSL Containers GA:本地AI容器的生命周期、网络与治理验收
java·网络·人工智能·后端
龙亘川1 小时前
铭记英烈守初心,数字强基促服务:亘川智城退役军人服务系统的实践与价值
java·数据库·人工智能
OxYGC1 小时前
[AI工程] Spring AI 第廿一篇:存量 REST 接口的 MCP 化改造实录——工具从哪条路径注册、参数描述怎么写、身份怎么过去
java·人工智能·spring
Zhou1411362 小时前
SpringBoot_02_自动配置原理
java·spring boot·后端
FYKJ_20102 小时前
SSM校园失物招领系统41452-计算机课程设计、毕业设计
java·vue.js·spring boot·python·mysql·typescript·spark
kv1102 小时前
Android studio国内开发有关
java·数据库·android studio
卓怡学长2 小时前
w198基于springboot始于足下健康打卡平台的设计与实现
java·spring boot·spring·intellij-idea
阿狗童鞋3 小时前
Java并发编程实战指南
java·开发语言
Joe_Wang53 小时前
【从0到1学习JVM · 15】对象在堆里来回倒腾,究竟怎样才会进老年代?
java·jvm·学习·垃圾回收