目的
Redis作为缓存中间件缓存数据,查询数据自动缓存
使用SpringCache + FastJson + Redis实现自动缓冲层
相关依赖
<!--redis-->
<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连接工具-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.3</version>
</dependency>
配置信息
redis常规配置
spring:
### redis 配置 ###
redis:
host: 127.0.0.1
port: 6379
database: 0
jedis:
pool:
max-active: 8
max-wait: -1
max-idle: 500
min-idle: 0
lettuce:
shutdown-timeout: 30000
添加配置类
缓存默认使用jdk序列化,可以通过FastJson提供的GenericFastJsonRedisSerializer修改序列化方式
序列化数据示例:
{
"@type": "com.lyne.entity.Student",
"age": 1,
"createTime": "2021-09-24 04:11:41",
"deleted": 0,
"id": 1,
"name": "text",
"updateTime": "2021-09-24 04:11:44"
}
自定义redisCacheManager 修改序列化方式:
@Configuration
@EnableCaching //开启缓存
public class RedisConfig {
//过期时间
@Value("${spring.redis.lettuce.shutdown-timeout}")
private Integer timeout;
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {
//fastjson官方提供了redis序列化类
GenericFastJsonRedisSerializer genericFastJsonRedisSerializer = new GenericFastJsonRedisSerializer();
//配置序列化(解决乱码的问题)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
//设置 key 过期时间
.entryTtl(Duration.ofSeconds(timeout))
//设置value序列化规则
.serializeValuesWith(RedisSerializationContext
.SerializationPair
.fromSerializer(genericFastJsonRedisSerializer))
.disableCachingNullValues();
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(config)
.build();
}
}
控制层添加缓存功能
- 通过注解方式
- 根据查询的数据和参数生成key
- 首查询redis是否存在key为这个键的值
- 若redis中没有这个数据,执行该方法返回数据,并将返回结果写入redis
- 若redis中存在这个数据,读取redis中的数据,反序列化并直接返回。不执行方法中的逻辑
@RestController
@RequestMapping("/student")
@CacheConfig(cacheNames = "student", cacheManager = "redisCacheManager") // 缓存配置
public class StudentController {
@Autowired
private StudentService studentService;
@GetMapping("/get/{id}")
@Cacheable(unless = "#result==null") //开启缓存
public Student get(@PathVariable("id") Integer id) {
// return studentService.getOne(new QueryWrapper<Student>().eq("id",id));
return studentService.getById(id);
}
}
-
通过API方式
使用
RedisTemplate
,RedisTemplate是Spring Data Redis 提供的直接进行Redis操作的Java API,可直接注入使用,更加便捷。需要自定义RedisTemplate,修改序列化方式
相关注解
注解 | 功能 |
---|---|
@Cacheable | 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 |
@CachePut | 能够根据方法的请求参数对其结果进行缓存,每次都会触发真实方法的调用 |
@CacheEvict | 主要针对方法配置,能够根据一定的条件对缓存进行清空 |
@CacheConfig | 配置方法配置注解都需要的一些公共配置属性 |
@Caching | 有时候我们可能组合多个Cache注解使用;比如用户新增成功后,我们要添加id–>user;username—>user;email—>user的缓存;此时就需要@Caching组合多个注解标签了。 |
自定义缓存注解 | 可以使用自定义注解把这些@Caching组合到一个注解中 |
自定义注解:
@Caching(put = {
@CachePut(value = "user", key = "#user.id"),
@CachePut(value = "user", key = "#user.username"),
@CachePut(value = "user", key = "#user.email")
})
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface UserSaveCache {
}
使用
@UserSaveCache
public User save(User user)