所谓缓存是一种存储机制,可将数据保存在某一个地方,并以一种更快的方式为以后的请求提供服务
spring 对于缓存提供了声明式缓存注解 ,并提供了四种类型的声明式缓存注解(同样是使用了AOP 技术实现),这些注解定义了那些 方法的返回值将要被缓存或者从缓存存储器中移除 ,需要注意的是,只有使用public 定义的方法才可以被缓存,当在一个类上使用注解时,该类中的每个公共方法都将被缓存到给定的存储器中或者从给定的存储器中移除
这四个注解如下
- @Cacheable
应用到读取数据的方法上,即可缓存的方法,如查找方法:先从缓存中读取,如果没有,再调用方法获取数据,然后把数据添加到缓存中,适用于查找 @Cacheable 有以下属性
value: 用于指定缓存器的名称 ,当然也可以在类上声明缓存器的名称 使用@CacheConfig(cacheNames = “userCache”) 声明
key: 键生成器 ,缓存值的键 ,在默认情况下,缓存抽象使用方法签名以及参数值作为一个键值 ,并将该键和方法调用的结果组成键值对 ,当然也可以使用 key 自定义键 同时 使用EL 表达式将值注入
condition 条件缓存 使用condition 属性 ,可以根据条件对一个方法应用缓存 - @CachePut
该注解与Cacheable 完成相同的工作,它通常首先执行方法,然后返回值到缓存。 该注解适合使用返回值来更新缓存存储器 - @CacheEvict
将一条或多条数据从缓存中删除,该注解常用于用户更新或删除操作对现有数据进行操作 也提供了 key 和 condition 属性 ,可以通过这些属性完成自定义键和条件 - @Caching
通过该注解可以组合多个注解策略在一个方法上
spring boot 集成ehcache 实现数据缓存
- 加入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
- 配置 eache.xml 文件
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
<cache name="userCache"
eternal="false"
maxEntriesLocalHeap="0"
timeToIdleSeconds="12000"/>
<!-- name 表示缓存名,可以配置多个 ,在需要使用cache 的地方使用 @CacheConfig(cacheNames = "cacheName") 引用 -->
<!-- eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false -->
<!-- maxEntriesLocalHeap:堆内存中最大缓存对象数,0没有限制 -->
<!-- timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,
如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。
只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态 -->
</ehcache>
- 在启动类上使用@EnableCaching 注解
@SpringBootApplication
@EnableCaching
public class SpingbootmybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpingbootmybatisApplication.class, args);
}
}
- 在具体方法上使用对应的ehcache 标签 以及@CacheConfig(cacheNames = “cacheName”) 设置了ehcache的名称,这个名称就是ehcache.xml内的名称
/**
* @Cacheable(key = "#id") 应用到读取数据的方法上,即可缓存的方法,如查找方法:先从缓存中读取,如果没有再调 用方法获取数据,然后把数据添加到缓存中,适用于查找
* @param id
* @return
*/
@Cacheable(key = "#id")
@Override
public User findUserById(int id) {
return userMapper.selectByPrimaryKey(id);
}
/**
* @CachePut 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用。适用于更新和插入
* @param user
*/
@Override
@CachePut
public void insertUser(User user) {
userMapper.insertSelective(user);
}
/**
* @CacheEvict 主要针对方法配置,能够根据一定的条件对缓存进行清空。适用于删除
* @param id
*/
@CacheEvict(key = "#id")
@Override
public void deleteUserById(int id) {
userMapper.deleteByPrimaryKey(id);
}
缓存的使用,很多时候需要根据实际的业务逻辑进行选择和设置。 更多的是需要和业务场景匹配已达到最好的使用效果,当然也可以使用redis 来实现(主要是通过修改cacheManager 来实现),后面会接着更新
demo 代码:srping boot 使用ehcache 实现缓存