【问题标题】:Cache with redis cache manager, redisTemplate and multiple serializers使用 redis 缓存管理器、redisTemplate 和多个序列化程序进行缓存
【发布时间】:2015-01-31 02:37:40
【问题描述】:

我需要缓存多种类型,例如:

public Country findCountry(String countryName)

和:

public List<Destination> findAllDestinations(String countryName)

我用的是RedisCacheManager,RedisTemplate只支持一个序列化器。

【问题讨论】:

    标签: caching collections redis


    【解决方案1】:

    经过一番研究,现在已经解决了。

    1. 将 spring-data-redis 更改为 1.4.2.RELEASE
    2. 使用您的类扩展 RedisCacheManager,将缓存映射到序列化程序 (cacheName->serializer) 并缓存名称
    3. 覆盖getCache方法(Cache getCache(String name)),根据缓存名称,在redis模板中设置序列化器名称
    4. 使用您的自定义缓存管理器

    例子-

    public class CustomRedisCacheManager extends RedisCacheManager
    {
        public static final String CACHE_NAME_DEFAULT = "default";
        public static final String CACHE_NAME_COUNTRY = "country";
        public static final String CACHE_NAME_DESTINATIONS = "destinations";    
    
        private Map<String, RedisCache> redisCaches = new HashMap<>();
    
        public CustomRedisCacheManager(Map<String, RedisTemplate> redisTemplates)
        {
            super(redisTemplates.get(CACHE_NAME_DEFAULT), redisTemplates.keySet());
    
            redisTemplates.keySet().stream().forEach(cacheName ->    redisCaches.put(cacheName, new RedisCache(cacheName, null,   redisTemplates.get(cacheName), 0)));
        }
    
        @Override
        public Cache getCache(String cacheName)
        {
            return redisCaches.get(cacheName);
        }
    }
    
    @Configuration
    @EnableCaching
    public class RedisConfiguration extends CachingConfigurerSupport
    {    
        @Bean
        public JedisConnectionFactory jedisConnectionFactory()
        {
            JedisConnectionFactory factory = new JedisConnectionFactory();
            factory.setHostName(redisHostName);
            factory.setPort(redisPort);            
            factory.setTimeout(100);
    
            return factory;
        }
    
        @Bean
        public CacheManager cacheManager()
        {
            Map<String, RedisTemplate> templates = new HashMap<>();
            templates.put(CACHE_NAME_DEFAULT, getDefaultRedisTemplate());
            templates.put(CACHE_NAME_COUNTRY, getMetadataRedisTemplate());
            templates.put(CACHE_NAME_DESTINATIONS, getDestinationsRedisTemplate());        
    
            SabreRedisCacheManager sabreRedisCacheManager = new    SabreRedisCacheManager(templates);
    
            return sabreRedisCacheManager;
        }
    
        @Bean
        public RedisTemplate<Object, Object> getDefaultRedisTemplate()
        {
            return getBaseRedisTemplate();
        }
    
        @Bean
        public RedisTemplate<Object, Object> getCountryRedisTemplate()
        {
            RedisTemplate<Object, Object> redisTemplate = getBaseRedisTemplate();
              redisTemplate.setValueSerializer(jsonRedisSerializer(Country.class));
    
            return redisTemplate;
        }
    
        @Bean
    public RedisTemplate<Object, Object> getDestinationsRedisTemplate()
    {
        RedisTemplate<Object, Object> redisTemplate = getBaseRedisTemplate();
        redisTemplate.setValueSerializer(jsonRedisSerializer(TypeFactory.defaultInstance().constructCollectionType(List.class, Destination.class)));
    
    
        return redisTemplate;
    }
    
    private RedisTemplate<Object, Object> getBaseRedisTemplate()
    {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        redisTemplate.setKeySerializer(stringRedisSerializer());
        redisTemplate.setHashKeySerializer(stringRedisSerializer());
        redisTemplate.setValueSerializer(jsonRedisSerializer(Object.class));
    
        return redisTemplate;
    }
    
    private Jackson2JsonRedisSerializer jsonRedisSerializer(Class type)
    {
        return jsonRedisSerializer(TypeFactory.defaultInstance().constructType(type));
    }
    
    private Jackson2JsonRedisSerializer jsonRedisSerializer(JavaType javaType)
    {
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(javaType);
        jackson2JsonRedisSerializer.setObjectMapper(new JsonObjectMapper());
    
        return jackson2JsonRedisSerializer;
    }
    }
    

    【讨论】:

    • 你能分享一些代码来更好地解释上述内容
    • 您不需要明确的缓存映射。 AbstractCacheManager 里面已经有了。你只需要让方法 addCache(Cache cache) 在你的 CacheManager 子类中可见%)
    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2018-02-10
    • 2018-11-29
    • 2011-09-13
    • 2020-01-27
    相关资源
    最近更新 更多