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
相关推荐
Kyrie_Li27 分钟前
Spring Boot Kafka 生产级配置全解析:从入门到精通
spring boot·后端·kafka
折哥的程序人生 · 物流技术专研1 小时前
《Java 100 天进阶之路》第50篇:阻塞队列与并发容器(2026版)
java·面试题·java进阶·blockingqueue·并发容器·集合源码·java100天进阶
ai_coder_ai1 小时前
编写自动化脚本,在自己后端服务中使用Open Api进行设备相关操作
java·运维·自动化
硕风和炜2 小时前
【LeetCode: 2492. 两个城市间路径的最小分数 + DFS】
java·算法·leetcode·深度优先·dfs·bfs·并查集
格子软件2 小时前
2026年GEO贴牌代理:分布式多级分账状态机源码深度解构
java·vue.js·分布式·vue·geo
我是一颗柠檬3 小时前
【Java项目技术亮点】加权轮询负载均衡算法
java·算法·负载均衡
灯厂码农3 小时前
C语言动态内存分配完全指南(malloc、calloc、realloc、free)
java·c语言·算法
无心水4 小时前
【全域智能营销实战】2、Spring AI 模块化架构深度解读:从 1.0 到 2.0 的演进与最佳实践
人工智能·spring·架构·harness·顶尖架构师·全域智能营销·harmess
梦梦代码精4 小时前
电商系统不是技术堆叠:LikeShop如何用分层Hold住复杂业务?
java·docker·代码规范
负责的蛋挞4 小时前
异步HttpModule的实现方式
java·服务器·前端