@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisCacheManager cacheManager() {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10)) // 设置缓存有效期为10分钟
.disableCachingNullValues() // 禁止缓存null值
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // 设置key序列化器
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); // 设置value序列化器
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(redisCacheConfiguration)
.build();
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
@Bean
@Override
public KeyGenerator keyGenerator() {
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
};
}
@Bean
@Override
public CacheResolver cacheResolver() {
return new SimpleCacheResolver(cacheManager());
}
}
在这个示例中,我们创建了一个 RedisCacheConfig
配置类,并继承了 CachingConfigurerSupport
。然后,我们重写了 cacheManager()
方法、keyGenerator()
方法和 cacheResolver()
方法来配置缓存管理器、缓存键生成器和缓存解析器。
在 cacheManager()
方法中,我们使用了 RedisCacheConfiguration 来配置 Redis 缓存的一些属性,比如缓存有效期、禁止缓存 null 值等。然后,我们使用 RedisCacheManager 来创建缓存管理器,并将 RedisCacheConfiguration 作为默认配置。
在 redisTemplate()
方法中,我们创建了一个 RedisTemplate 对象,并设置了 key 序列化器、value 序列化器、hash key 序列化器和 hash value 序列化器。
在 keyGenerator()
方法中,我们使用了一个自定义的缓存键生成器,该生成器将目标对象的类名、方法名和参数列表拼接成一个字符串作为缓存键。
最后,在 cacheResolver()
方法中,我们返回了一个 SimpleCacheResolver 对象,该对象使用了我们在 cacheManager()
方法中所创建的缓存管理器。
通过这样的配置,我们就可以在需要使用缓存的方法上添加 @Cacheable
注解,让 Spring 自动地将方法的返回值缓存到 Redis 中。例如:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
@Cacheable(value = "user", key = "#id")
public User getUserById(Long id) {
System.out.println("从数据库中获取用户信息");
return userRepository.findById(id);
}
}
在这个示例中,我们在 getUserById()
方法上添加了 @Cacheable
注解,并指定了缓存名称为 user
,缓存键为方法的参数 id
。这样,当第一次调用该方法时,Spring 会将方法的返回值缓存到 Redis 中。当下次再次调用该方法时,Spring 就会直接从 Redis 中获取缓存的结果,而不是再次执行方法。