写在前面
Spring Boot 系列文章源于 深入实践Spring Boot 一书(感谢作者)。时过境迁,我使用了更新的版本来学习。写下系列的博客,一则为了加强记忆,便于回顾,再则也希望帮助到正在学习 Spring Boot 的同学。当然,这也算给自己列下了学习计划吧!
使用 Redis 做缓存,一方面可以像前文所写的那样,另一方面,可以使用注解的方式来调用
1. 使用 Spring Cache 注解
如果 Redis 可用并已配置,则自动配置 RedisCacheManager
。通过设置spring.cache.cache-names,可以在启动时创建额外的缓存。可以使用 spring.cache.redis.* 配置缓存属性。例如,下面的配置创建了cache1和cache2缓存,缓存的存活时间为10分钟
spring:
cache:
cache-names: cache1,cache2
redis:
time-to-live: 10s
key-prefix: springtest
注意:如果在这里指定了 key-prefix ,则可能会覆盖掉注解指定前缀值(我测试的结果是这样)。
启动缓存配置类:
@Configuration
@EnableCaching
public class CustomRedisCacheConfiguration extends CachingConfigurerSupport {
}
当然,你也可以通过添加自己的 RedisCacheConfiguration
Bean 来完全控制配置。在上面的类中加入以下代码:
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public CacheManager cacheManager() {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
CacheManager cacheManager = new RedisCacheManager(RedisCacheWriter.lockingRedisCacheWriter(redisConnectionFactory),redisCacheConfiguration.entryTtl(Duration.ofDays(2)));
return cacheManager;
}
Service 类:
@Service
public class UserService {
@Cacheable(cacheNames = {"UserService:findById:id","UserService:findById2:id"})
public String findById(String id) {
System.out.println("执行数据库调用");
return "获取到结果";
}
}
@Cacheable
为存取缓存,@CachePut
为修改缓存,CacheEvict
为删除缓存,各个注解中的 value 参数是一个 key 的前缀,并由 keyGenerator 按一定的规则生成一个唯一标识。
测试如下:
@Test
public void findById(){
String result = userService.findById("nothing");
System.out.println(result);
}
观察 redis 中存在的key 以及其 ttl 值。
2. 使用 RedisTemplate
使用注解只能对简单对象进行系列化操作,对于像实体 User 这样的包含了一定关系的复杂对象,或其他集合、列表对象等,就不能使用简单注解的方法来实现了。
首先从 Redis 读取,如果存在,则不再到 Mysql 中读取,如果不存在再到 Mysql 读取,并将读取的结果暂时保存在 Redis 中。
具体的代码就不再写了,可以参考另一篇 Spring Boot 使用 Redis。