网站后台文本编辑器,网线插座接法,母婴用品商城网站建设,海口建网站 模板前言
当多次查询数据库影响到系统性能的时候#xff0c;可以考虑使用缓存#xff0c;来解决数据访问新能的问题。 SpringBoot 已经为我们提供了自动配置多个 CacheManager 的实现#xff0c;只要去实现使用它就可以了。
一般的系统都是优先使用 EhCache#xff0c;它工作…前言
当多次查询数据库影响到系统性能的时候可以考虑使用缓存来解决数据访问新能的问题。 SpringBoot 已经为我们提供了自动配置多个 CacheManager 的实现只要去实现使用它就可以了。
一般的系统都是优先使用 EhCache它工作在 JAVA 进程中在传统的应用没有太大要求的时候使用它比较方便分布式系统中去使用 Shiro 集中管理缓存。
正文
加入依赖
在 pom.xml 中加入依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-cache/artifactId/dependencydependencygroupIdnet.sf.ehcache/groupIdartifactIdehcache/artifactId/dependency添加缓存相关的配置
新建 ehcache.xml加入缓存相关参数 我新添加一个 name 为 users 的缓存设置
?xml version1.0 encodingUTF-8?
ehcache xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:noNamespaceSchemaLocationhttp://ehcache.org/ehcache.xsdupdateCheckfalsediskStore pathjava.io.tmpdir/Tmp_EhCache/defaultCachemaxElementsInMemory1000maxEntriesLocalHeap400eternalfalsetimeToIdleSeconds120timeToLiveSeconds120overflowToDiskfalsediskPersistentfalsediskExpiryThreadIntervalSeconds120/cachenameusersmaxEntriesLocalHeap200timeToLiveSeconds600//ehcache参数详解
name:缓存名称。maxElementsInMemory缓存最大个数。eternal:对象是否永久有效一但设置了timeout将不起作用。timeToIdleSeconds设置对象在失效前的允许闲置时间单位秒。仅当eternalfalse对象不是永久有效时使用可选属性默认值是0也就是可闲置时间无穷大。timeToLiveSeconds设置对象在失效前允许存活时间单位秒。最大时间介于创建时间和失效时间之间。仅当eternalfalse对象不是永久有效时使用默认是0.也就是对象存活时间无穷大。overflowToDisk当内存中对象数量达到maxElementsInMemory时Ehcache将会对象写到磁盘中。diskSpoolBufferSizeMB这个参数设置DiskStore磁盘缓存的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。maxElementsOnDisk硬盘最大缓存个数。diskPersistent是否缓存虚拟机重启期数据默认为false。diskExpiryThreadIntervalSeconds磁盘失效线程运行时间间隔默认是120秒。memoryStoreEvictionPolicy当达到maxElementsInMemory限制时Ehcache将会根据指定的策略去清理内存。默认策略是LRU最近最少使用。你可以设置为FIFO先进先出或是LFU较少使用。clearOnFlush内存数量最大时是否清除。memoryStoreEvictionPolicy当达到maxElementsInMemory限制时Ehcache将会根据指定的策略去清理内存。默认策略是LRU最近最少使用。你可以设置为FIFO先进先出或是LFU较少使用。
开启缓存
在系统配置文件中指定 在配置文件中加入指定我们设置的 ehcache.xml 作为 EhCache 的配置文件
spring:cache:ehcache:config: config/ehcache.xml # 指定 ehcache.xml 创建EhCache的缓存管理器type: ehcache # 指定缓存管理器在启动类上加上注解 EnableCaching开启缓存。
使用
使用的时候需要注意我们之前在 shiro 缓存中 配置了相关的缓存的配置现在需要把 shiro 相关的缓存的内容全部都要删除掉不然两者的缓存会存在冲突。 还是以 shiro 的获取权限列表的服务为例不用 shiro-cache 后直接在查询的这里自己添加上缓存就可以了。
CacheConfig(cacheNames users)
public interface ShiroService {/*** 获取用户权限** param userId 用户ID* return 权限*/CacheableSetString getUserPermissions(long userId);debug 调试
Autowired
private CacheManager cacheManager;发现 key 为 users 中存储了相关内容。
注解的使用 CacheConfig主要用于配置该类中会用到的一些共用的缓存配置。在这里CacheConfig(cacheNames users)配置了该数据访问对象中返回的内容将存储于名为users的缓存对象中我们也可以不使用该注解直接通过Cacheable自己配置缓存集的名字来定义。 Cacheable配置了 getUserPermissions(long userId)函数的返回值将被加入缓存。同时在查询时会先从缓存中获取若不存在才再发起对数据库的访问。该注解主要有下面几个参数 value、cacheNames两个等同的参数cacheNames为Spring 4新增作为value的别名用于指定缓存存储的集合名。由于Spring 4中新增了CacheConfig因此在Spring 3中原本必须有的value属性也成为非必需项了。key缓存对象存储在Map集合中的key值非必需缺省按照函数的所有参数组合作为key值若自己配置需使用SpEL表达式比如Cacheable(key #p0)使用函数第一个参数作为缓存的key值更多关于SpEL表达式的详细内容可参考官方文档condition缓存对象的条件非必需也需使用SpEL表达式只有满足表达式条件的内容才会被缓存比如Cacheable(key #p0, condition #p0.length() 3)表示只有当第一个参数的长度小于3的时候才会被缓存unless另外一个缓存条件参数非必需需使用SpEL表达式。它不同于condition参数的地方在于它的判断时机该条件是在函数被调用之后才做判断的所以它可以通过对result进行判断。keyGenerator用于指定key生成器非必需。若需要指定一个自定义的key生成器我们需要去实现org.springframework.cache.interceptor.KeyGenerator接口并使用该参数来指定。需要注意的是该参数与key是互斥的。cacheManager用于指定使用哪个缓存管理器非必需。只有当有多个时才需要使用。cacheResolver用于指定使用那个缓存解析器非必需。需通过org.springframework.cache.interceptor.CacheResolver接口来实现自己的缓存解析器并用该参数指定。
除了这里用到的两个注解之外还有下面几个核心注解 * CachePut配置于函数上能够根据参数定义条件来进行缓存它与Cacheable不同的是它每次都会真是调用函数所以主要用于数据新增和修改操作上。它的参数与Cacheable类似具体功能可参考上面对Cacheable参数的解析 * CacheEvict配置于函数上通常用在删除方法上用来从缓存中移除相应数据。除了同Cacheable一样的参数之外它还有下面两个参数
allEntries非必需默认为false。当为true时会移除所有数据beforeInvocation非必需默认为false会在调用方法之后移除数据。当为true时会在调用方法之前移除数据。
缓存配置 在Spring Boot中通过EnableCaching注解自动化配置合适的缓存管理器CacheManagerSpring Boot根据下面的顺序去侦测缓存提供者 GenericJCache (JSR-107)EhCache 2.xHazelcastInfinispanRedisGuavaSimple 通常还是推荐去指定一个 缓存类型比较好在系统配置文件配置
spring:cache:type: ehcache参考文章
Spring Boot中的缓存支持一注解配置与EhCache使用