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
相关推荐
不负岁月无痕19 分钟前
C++ 模板核心内容与高频面试题汇总
java·开发语言·c++
Flittly21 分钟前
【AgentScope Java新手村系列】(2)第一个Agent-基础对话
java·spring boot·spring·ai
摇滚侠34 分钟前
Spring MVC 不是一个单独的框架,是 Spring 框架的一个模块
java·spring·mvc
阿正的梦工坊37 分钟前
【Rust】04-借用、引用与切片
java·数据库·rust
小二·1 小时前
Spring Boot 3 + Vue 3 全栈开发实战
vue.js·spring boot·后端
devilnumber1 小时前
静态代理 & 动态代理:实战运用 + 场景区别 + 怎么选
java·开发语言·代理模式
码农飞哥1 小时前
Spring Boot 多角色权限隔离实战:接口层+路由层+UI层三层防御,杜绝生产数据泄露
spring boot·状态模式·架构设计·系统设计·权限控制
Upsy-Daisy1 小时前
Hermes Agent 学习笔记 02:安装、配置与第一次运行
java·前端·数据库
SuperArc19991 小时前
SpringBoot+Slf4j+Log4j2+mybatis 日志整合
spring boot·mybatis·log4j2·slf4j·日志整合
用户4682557459131 小时前
Testcontainers 在 Windows Docker Desktop 上跑不通:协议层不兼容 + 4 种可行环境
java·后端