一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
如何在Springboot中使用Redis进行缓存
依赖及yml配置
<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>
# 配置redis以及cache
spring:
redis:
host: 127.0.0.1
port: 6379
password:
timeout: 10000 #连接超时时间
缓存配置:
- 开启基于注解的缓存 @EnableCaching
- 设置缓存数据时value序列化、key生成 策略
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(factory);
// 创建json序列化对象
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置key序列化String
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 设置value序列化 json
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
// 设置hash key序列化String
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// 设置hash value 序列化json
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
// 初始化redis完成序列化的方法
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
-
配置缓存管理器 java
@Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() //设置缓存默认超时时间 30分钟 //.entryTtl(Duration.ofMillis(30)) .disableCachingNullValues() // 设置key序列化 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); return RedisCacheManager.builder(factory).cacheDefaults(cacheConfiguration).build(); }
缓存操作
-
设置缓存
@Cacheable: 有缓存就读缓存,没有才执行将返回值设置到缓存中@Cacheable(value = "userCache", key = "111") //对应key userCache::111 @PostMapping("/saveTest") public String saveTest() { log.error("----查询数据库----"); return "查询数据库"; } -
更新缓存
@CachePut:保证方法被调用,并且将返回结果缓存到Redis
@PostMapping("/updateTest") @CachePut(value = "userCache", key = "111") //对应key userCache::111 public String updateTest() { log.error("----更新缓存----"); return "删除缓存->1"; } -
删除缓存
@CacheEvict:删除对应缓存
@PostMapping("/deleteTest") @CacheEvict(value = "userCache", key = "111") //对应key userCache::111 public String deleteTest() { log.error("----删除缓存----"); return "删除缓存"; }上面的注解有匹配上的value和key相同的时候,表示操作同一个key
上面的注解内可以添加的变量都有:- value: 缓存的名称 ,@Cacheable(value=”mycache”)、@Cacheable(value={”cache1”,”cache2”}
- key:缓存的 key,可以为空 。支持SpEL 表达式编写
- condition:缓存的条件,支持SpEL 表达式编写,返回true表示进行上述三个注解的操作
- unless:否定缓存,当条件为TRUE时,就不会缓存。支持SpEL 表达式编写
CacheEvict 专有变量:
- allEntries:是否清空所有缓存内容,缺省为 false。
- beforeInvocation:是否在方法执行前就清空,缺省为 false(缺省时,如果执行异常,则不会清空缓存)。