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
相关推荐
盖世英雄酱5813612 分钟前
物品超领取损失1万事故复盘(一)
java·后端
CryptoRzz18 分钟前
印度尼西亚(IDX)股票数据对接开发
java·后端·websocket·web3·区块链
f***28141 小时前
Springboot中使用Elasticsearch(部署+使用+讲解 最完整)
spring boot·elasticsearch·jenkins
你怎么知道我是队长1 小时前
C语言---文件读写
java·c语言·开发语言
小毅&Nora1 小时前
【后端】【SpringBoot】① 源码解析:从启动到优雅关闭
spring boot·后端·优雅关闭
wszy18092 小时前
外部链接跳转:从 App 打开浏览器的正确姿势
java·javascript·react native·react.js·harmonyos
期待のcode2 小时前
认识Java虚拟机
java·开发语言·jvm
raining_peidx2 小时前
xxljob源码
java·开发语言
肥猪猪爸2 小时前
双重检查锁(DCL)与 volatile 的关键作用
java·开发语言·单例模式