redis - 带有 Spring Data Redis 2.0.3 的缓存管理器

标签 redis spring-data-redis

目前,我通过将@Cachable 与Ehcache 一起使用来使用spring 缓存。我即将使用 Spring Data Redis 2.0.3 将 Ehcache 替换为 Redis。我在网上看到的所有例子都是基于它的旧版本,但新版本的构造函数格式不同。

这是我当前的 cacheManager conf:

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:ehcache.xml"/>
    <property name="shared" value="true"/>
</bean>

基于旧版本使用Redis的例子是:

<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"
        c:template-ref="redisTemplate" />

新版本中的构造函数与旧版本完全不同,新版本的所有示例都将所有内容手动放入缓存中,如下所示:

redisTemplate.opsForHash().put(user.getObjectKey(), user.getKey(), user);

我仍然想使用 cacheManager 和 @cachable 但不知道如何使用新版本的 Spring Data Redis 配置 cacheManager bean。新版本的构造函数需要RedisCacheWriter:

 public RedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) 

如果您能分享您关于如何设置 cacheManager 以将 @Cachable 与新版本的 Spring Data Redis(最低 2.0.3)一起使用的想法,我将不胜感激。

最佳答案

在Spring Data Redis 2.0+中,你可以这样写:

/**
 * Redis config.
 *
 * @author chenxinyu
 */
@Configuration
@EnableCaching
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private Integer redisPort;

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        RedisStandaloneConfiguration configuration =
                new RedisStandaloneConfiguration(redisHost, redisPort);
        return new JedisConnectionFactory(configuration);
    }

    @Bean(name = "redisTemplate")
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        RedisSerializer stringRedisSerializer = new StringRedisSerializer();

        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
        redisTemplate.setConnectionFactory(factory);

        return redisTemplate;
    }

    @Bean
    public CacheManager initRedisCacheManager(RedisConnectionFactory factory) {
        RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager
                .RedisCacheManagerBuilder.fromConnectionFactory(factory);
        return builder.build();
    }

}

这只是一个示例,您可以在RedisCacheManager.java中查看更多方法。

关于redis - 带有 Spring Data Redis 2.0.3 的缓存管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50949773/

相关文章:

Redis:删除旧的未使用数据

java - 在 Spring Boot 中 FindByIndexNameSessionRepository 不能为空

java - 在Spring Boot App中使用Redis Stream通过HTTP长轮询来阻止HTTP响应

spring-boot - 如何使 Redis 存储库具有事务性

java - 绝地武士得到陈旧的数据

php - 在程序运行时使用 C 连接到数据库(Redis)一次

memory-management - Redis - 如何存储我的数据?

java - ReactiveRedisTemplate opsForHash put 不会覆盖值

redis - 无法在 spring-data-redis 事务中查询列表

php - 带列表的 Redis 通知