我需要缓存多种类型,例如:
public Country findCountry(String countryName)
和:
public List<Destination> findAllDestinations(String countryName)
我正在使用RedisCacheManager和RedisTemplate仅支持一个串行器。
经过一些研究,现在已解决。
范例-
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; } }