SpringBoot-缓存
几个重要概念&缓存注解
专业术语 | 解释 |
---|---|
Cache | 缓存接口,定义缓存操作,实现有RedisCache、EhCacheCache、ConcurrentMapCache等 |
CacheManager | 缓存管理器,管理各种缓存(Cache)组件 |
@Cacheable | 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 |
@CacheEvict | 清空缓存 |
@CachePut | 更新缓存,保证方法被调用,又希望结果被缓存 |
@EnableCaching | 开启基于注解的缓存 |
keyGenerator | 缓存数据时key生成策略 |
serialize | 缓存数据时value序列化策略 |
缓存使用
1、启动文件配置
1 | /** |
2、service配置
1 | // @CacheConfig: 定义公共缓存配置 |
其中可以自己写keyGenerator,如:
1 |
|
缓存注解中使用的SpEL表达式
名字 | 位置 | 描述 | 示例 |
---|---|---|---|
methodName | root object | 当前被调用的方法名 | #root.methodName |
method | root object | 当前被调用的方法 | #root.method.name |
target | root object | 当前被调用的目标对象 | #root.target |
targetClass | root object | 当前被调用的目标对象类 | #root.targetClass |
args | root object | 当前被调用的方法的参数列表 | #root.args[0] |
caches | root object | 当前被调用使用的缓存列表 | #root.caches[0].name |
argument name | evaluation context | 方法参数名字,可以直接 #参数名,也可以使用 #p0或#a0的形式,0代表参数的索引 | #iban、#a0、#p0 |
result | evaluation context | 方法执行后的返回值(仅当方法执行之后的判断有效,如'unless','cache put'的表达式'cache evict'的表达式beforeInvocation=false) | #result |
整合redis作为缓存
使用docker安装redis
1
2docker pull redis
docker run --name myredis -d -p 6379:6379 redis引入redis的starter
1
2
3
4<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>配置redis
1
127.0.0.1 =
如果是对象,则javabean需要实现Serializable,同时可自定义配置规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class MyRedisConfig {
public RedisTemplate<Object, User> userRedisTemplate(
RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException{
RedisTemplate<Object,User> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer<User> ser = new Jackson2JsonRedisSerializer<User>(User.class);
template.setDefaultSerializer(ser);
return template;
}
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
Jackson2JsonRedisSerializer<User> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(User.class);
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(100)) // 设置缓存有效期100s
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));
return RedisCacheManager
.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(redisCacheConfiguration).build();
}
}自定义template使用
1
2
3
4// 1.将数据以json方式保存
// 1. 自己将对象转json
// 2. redisTemplate默认的序列化规则
userRedisTemplate.opsForValue().set("user",userMapper.getUserById(1));