Spring为我们提供了工具解决缓存读取,和数据同步问题。
参考:https://www.jianshu.com/p/6db623355e11 写的很给力
1、引入jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2、application.yml
spring:
redis:
open: true # 是否开启redis缓存 true开启 false关闭
database: 0
host: ilove #主机地址写自己的
# host: localhost
port: 6379
password: # 密码(默认为空)
timeout: 60000ms # 连接超时时长(毫秒)
jedis:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连接
server:
port: 9977
3、讲解
注解含义:
- @EnableCaching 开启SpringCache功能
- @Cacheable 修饰方法。在方法执行之前,会先访问缓存找数据,如果有数据会直接返回缓存中的数据,不会执行方法。如果没数据,会执行方法,并且将返回结果存入缓存。
- @CacheEvict 触发缓存清理。
- @CachePut 与Cacheable有一点类似,都会将方法的执行结果存入缓存。但是@CachePut每次都会执行方法,然后将结果存入缓存。使用场景适用于更新操作。
@Cacheable
属性 | 描述 |
---|---|
value | 缓存的名称 |
cacheNames | 缓存的名称 value和cacheNames是一样的 |
key | 缓存的键的值 ,支持SPEL表达式 |
keyGenerator | 缓存的键的生成策略,指定一个bean的名称,这个bean得是KeyGenerator的实现。如果声明了自定义策略,上面的key声明将会失效 |
condition | 缓存促发的条件,默认true ,支持SPEL表达式 |
unless | 缓存促发条件,在方法之后执行,支持SPEL表达式 |
SPEL表达式:
上面的key,condition等属性支持SPEL表达式,能够在注解中获取方法名,参数值等属性。具体用法如下:
如果想定义一个普通的key,为popApplication10
需要注意的是,并不是直接写key=“popApplication10”,能注意到其实还要再内容中加入一个单引号修饰。因为,加了单引号,才表示这是个字符串,否则会被当做SPEL处理,到时候会提示你找不到一个叫popApplication10的对象。
使用方法名+参数写
自定义KeyGenerator生成key
/**
* key的生成策略1
* 方法名当key
* @return
*/
@Bean
public KeyGenerator nameKeyGenerator() {
return (Object target, Method method, Object... params) -> method.getName();
}
@Cacheable(value = "user", keyGenerator = "nameKeyGenerator",condition = "#root.methodName.length() > 5")
public String username() {
return "tzq";
}
@CacheEvict
删除缓存,这一块可以配合condition使用,满足条件就清理缓存
例如,如果传入了删除数据的id,就清理缓存
配置缓存的自动过期时间
为了保证数据的准确性。这一块需要注意,我们明显不可能永远从缓存中取数据。
保证缓存数据与数据库数据一至的处理办法除了手动触发缓存更新。还要让缓存有一个过期时间。
@Primary
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(10)) // 设置缓存过期时间10秒
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new
GenericJackson2JsonRedisSerializer())); //
return RedisCacheManager
.builder(connectionFactory)
.cacheDefaults(cacheConfiguration)
.transactionAware()
.build();
}
CacheManager是SpringCache的配置Bean。可以设置过期时间,控制不缓存等属性。
使用CacheManager也可以手动操作缓存的数据。
如:
@Autowired
CacheManager cacheManager;
public String[] values() {
//cache为user的cache ,可以执行get或put操作user中的数据。比较简单
Cache cache = cacheManager.getCache("user");
return new String[]{
cache.get("username",String.class),
cache.get("phone",String.class)
};
}