SpringBoot集成EhCache
Maven依赖:
1 2 3 4 5 6 7 8 9 10 | <!-- EhCache --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version> 2.10 . 4 </version> </dependency> |
配置ehcache.xml(resources→config→ehcache.xml):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <?xml version= "1.0" encoding= "UTF-8" ?> <ehcache xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://ehcache.org/ehcache.xsd" updateCheck= "false" > <!--指定一个文件目录,当EhCache把数据写到硬盘上时,将把数据写到这个文件目录下 user.home : 用户主目录 user.dir : 用户当前工作目录 java.io.tmpdir : 默认临时文件路径(C:\Users\Administrator\AppData\Local\Temp\Tmp_EhCache) --> <diskStore path= "java.io.tmpdir/Tmp_EhCache" /> <!-- name: 缓存名称 eternal: true 表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为 false timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。只有当eternal属性为 false ,该属性才有效。如果该属性值为 0 ,则表示对象可以无限期地处于空闲状态 timeToLiveSeconds: 设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除。只有当eternal属性为 false ,该属性才有效。如果该属性值为 0 ,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义 maxElementsInMemory: 内存中最大缓存对象数;maxElementsInMemory界限后,会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行 memoryStoreEvictionPolicy: 当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数) maxElementsOnDisk: 硬盘中最大缓存对象数,若是 0 表示无穷大 overflowToDisk: 是否保存到磁盘,当系统宕机时 diskPersistent: 是否缓存虚拟机重启期数据,是否持久化磁盘缓存,当这个属性的值为 true 时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件,这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存,要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush()方法 diskSpoolBufferSizeMB: 这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区 diskExpiryThreadIntervalSeconds: 磁盘失效线程运行时间间隔,默认为 120 秒 clearOnFlush: 内存数量最大时是否清除 --> <!--defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则默认缓存策略--> <defaultCache eternal= "false" maxElementsInMemory= "1000" overflowToDisk= "true" diskPersistent= "true" timeToIdleSeconds= "0" timeToLiveSeconds= "600" memoryStoreEvictionPolicy= "LRU" /> <cache name= "user" eternal= "false" maxElementsInMemory= "200" overflowToDisk= "false" diskPersistent= "true" timeToIdleSeconds= "0" timeToLiveSeconds= "300" memoryStoreEvictionPolicy= "LRU" /> </ehcache> |
EhCache配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | package com.example.demo.Config; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.ehcache.EhCacheCacheManager; import org.springframework.cache.ehcache.EhCacheManagerFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; @Configuration @EnableCaching public class EhcacheConfig { @Bean public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean) { return new EhCacheCacheManager(bean.getObject()); } /** * 据shared与否的设置, * Spring分别通过CacheManager.create() * 或new CacheManager()方式来创建一个ehcache基地. * 也说是说通过这个来设置cache的基地是这里的Spring独用,还是跟别的(如hibernate的Ehcache共享) * * @return */ @Bean public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() { EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean(); cacheManagerFactoryBean.setConfigLocation( new ClassPathResource( "config/ehcache.xml" )); cacheManagerFactoryBean.setShared( true ); return cacheManagerFactoryBean; } } |
Service层方法加上注解:添加-删除-更新(@Cacheable()、@CacheEvict()、@CachePut()):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package com.example.demo.Service.Impl; import com.example.demo.Entity.Cache; import com.example.demo.Repository.CacheRepository; import com.example.demo.Service.CacheService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.List; @Service public class CacheServiceImpl implements CacheService { @Autowired private CacheRepository cacheRepository; @Override @Cacheable (value = "user" ) public List<Cache> list() { System.out.println( "MySQL查询啦!!!!。。。。" ); return cacheRepository.findAll(); } @Override @CacheEvict (value = "user" ) public void deleteCacheUser() { } } |
测试:
http://localhost:8032/api/user
http://localhost:8032/api/delete
GitHub源码:https://github.com/zeng-xian-guo/springboot_jwt_token.git
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?