多个redistemplate_与redis缓存管理器,redisTemplate和多个序列化缓存

I need to cache multiple types like:

public Country findCountry(String countryName)

and:

public List findAllDestinations(String countryName)

I am using RedisCacheManager and RedisTemplate only support only one serializer.

解决方案

It is solved now after some research.

change spring-data-redis to 1.4.2.RELEASE

extend RedisCacheManager with your class with cache map to serializer (cacheName->serializer) and caches names

overrides the getCache method(Cache getCache(String name)) and based on cache name, set the serializer name in the redis template

use your customized cache manager

Example -

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 redisCaches = new HashMap<>();

public CustomRedisCacheManager(Map 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 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 getDefaultRedisTemplate()

{

return getBaseRedisTemplate();

}

@Bean

public RedisTemplate getCountryRedisTemplate()

{

RedisTemplate redisTemplate = getBaseRedisTemplate();

redisTemplate.setValueSerializer(jsonRedisSerializer(Country.class));

return redisTemplate;

}

@Bean

public RedisTemplate getDestinationsRedisTemplate()

{

RedisTemplate redisTemplate = getBaseRedisTemplate();

redisTemplate.setValueSerializer(jsonRedisSerializer(TypeFactory.defaultInstance().constructCollectionType(List.class, Destination.class)));

return redisTemplate;

}

private RedisTemplate getBaseRedisTemplate()

{

RedisTemplate 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;

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值