!=需要前期进行缓存环境的搭建:===== 1.pom文件的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency>2.建立cache的配置文件,并在配置文件中,对默认的配置进行配置,以及制定自己的一些缓存策略。
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> <diskStore path="java.io.tmpdir" /> //默认配置 <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU" /> <cache name="userCache" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="300" overflowToDisk="false" memoryStoreEvictionPolicy="LRU"> <!-- 配置缓存事件监听器 replicateAsynchronously 操作是否异步,默认值为true. replicatePuts 添加操作是否同步到集群内的其他缓存,默认为true. replicateUpdates 更新操作是否同步到集群内的其他缓存,默认为true. replicateUpdatesViaCopy 更新之后的对象是否复制到集群中的其他缓存(true); replicateRemovals 删除操作是否同步到集群内的其他缓存,默认为true. --> <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" properties=" replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=true, replicateRemovals=true " /> <!-- 初始化缓存,以及自动设置 --> <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory" properties="bootstrapAsynchronously=true" /> </cache> //自己定义的缓存策略,用name值来确定后端代码使用哪一种缓存 <cache name="listGo" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="300" overflowToDisk="false" memoryStoreEvictionPolicy="LRU"> <!-- 配置缓存事件监听器 replicateAsynchronously 操作是否异步,默认值为true. replicatePuts 添加操作是否同步到集群内的其他缓存,默认为true. replicateUpdates 更新操作是否同步到集群内的其他缓存,默认为true. replicateUpdatesViaCopy 更新之后的对象是否复制到集群中的其他缓存(true); replicateRemovals 删除操作是否同步到集群内的其他缓存,默认为true. --> </ehcache> // 说明: 1 <diskStore path="java.io.tmpdir"/>这个是磁盘存储路径,当内存缓存满了的时候,就会往这里面放,java.io.tmdir是操作系统缓存的临时目录,不同操作系统缓存目录不一样。 maxElementsInMemory: 内存缓存中最多可以存放的元素数量,若放入Cache中的元素超过这个数值,则有以下两种情况 1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中 2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素 overflowToDisk :内存不足时,是否启用磁盘缓存 eternal :缓存中对象是否永久有效 timeToIdleSeconds: 缓存数据在失效前的允许闲置时间(单位:秒),仅当eternal=false时使用,默认值是0表示可闲置时间无穷大,若超过这个时间没有访问此Cache中的某个元素,那么此元素将被从Cache中清除 timeToLiveSeconds :缓存数据的总的存活时间(单位:秒),仅当eternal=false时使用,从创建开始计时,失效结束。 maxElementsOnDisk : 磁盘缓存中最多可以存放的元素数量,0表示无穷大 diskExpiryThreadIntervalSeconds:磁盘缓存的清理线程运行间隔,默认是120秒 memoryStoreEvictionPolicy:内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存 共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出) 另外,defaultCache是默认缓存方式,cache是自定义的缓存方式,自行设置name3.在Springboot配置文件中把ehcache.xml配置进去;即在application.properties中加入以下配置代码
spring.cache.ehcache.config=ehcache.xml4.在启动类前加上@EnableCaching注解;这样的话,启动类启动时会去启动缓存启动器。
@SpringBootApplication @MapperScan("com.yunxing.mapper") @EnableCaching//启动类启动时会去启动缓存启动器 public class app { public static void main(String[] args) { SpringApplication.run(app.class, args); } }5.实体类实现可序列化接口Serializable;由于需要实体类支持缓存中的磁盘存储,所以需要实体类实现可序列化接口
public class user implements Serializable{}6.使用@Cacheable把数据存进缓存,下面就是专门把方法返回值存入缓存
@Service @Transactional //事务,表示该类下所有的都受事务控制 public class userServiceImpl implements userService { @Autowired private userMapper usermapper; @Override @Cacheable(value="users")//专门把方法返回值存入缓存 public user selectUserById(int id) { user user=this.usermapper.selectUserById(id); System.out.println("00"); return user; } } //说明: @Cacheable可以标记在一个方法上,也可以标记在一个类上,当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果。
@Cacheable可以指定三个属性,value、key和condition。 value属性指定cache的名称(即选择ehcache.xml中哪种缓存方式存储) key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。 当我们没有指定该属性时,Spring将使用默认策略生成key。我们也直接使用“#参数名”或者“#p参数index”。 代碼示例:
@Cacheable(value="users", key="#user.id") public User find(User user) { return null; }7.最后,使用@CacheEvict清除缓存;
@CacheEvict(value="users",allEntries=true) public void saveUsers(Users users) { this.usersRepository.save(users); }说明:@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。 其中value、key和condition的语义与@Cacheable对应的属性类似;allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。 当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。