@cachingconfigurersupport注解结合redis自定义缓存读写机制

@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 中获取缓存的结果,而不是再次执行方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值