Spring RedisTemplate:将多个Model类序列化为JSON。需要使用多个RedisTemplates吗?

我正在使用Spring Redis支持在Redis中保存我的对象。

我有几个处理不同Model类的DAO:

例如:’ShopperHistoryDao’将保存/检索’ShopperHistoryModel”ShopperItemHistoryDao’的对象,它将处理’ItemHistoryModel’的对象

我想使用’JacksonJsonRedisSerializer’将我的对象序列化/反序列化为json。

但是在JacksonJsonRedisSerializer的构造函数中,它需要一个特定的Model类。

JacksonJsonRedisSerializer(Class type) 

这是否意味着,我必须为每个不同的Model类配置单独的RedisTemplates并在适当的DAO实现中使用它们?

就像是 :

                 

GenericJackson2JsonRedisSerializer应该完成这项工作

  @Bean public RedisTemplate redisTemplate() { RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(jedisConnectionFactory()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } 

这会将@Class属性添加到JSON以理解类型,这有助于Jackson反序列化,因此无需在配置类上显式映射模型。

 "{\"@class\":\"com.prnv.model.WhitePaper\",\"title\":\"Hey\",\"author\":{\"@class\":\"com.prnv.model.Author\",\"name\":\"Hello\"},\"description\":\"Description\"}" 

在服务中,您可以使用缓存模型

  @Cacheable(value = "whitePaper", key = "#title") public WhitePaper findWhitePaperByTitle(String title) { WhitePaper whitePaper = repository.findByTitle(title); return whitePaper; } 

查看这篇文章: http : //blog.pranavek.com/2016/12/25/integrating-redis-with-spring-application

是的, RedisTemplate似乎被设计为具有值序列化器的单个实例。

我打算建议使用包含内部序列化器映射的RedisSerializer的可能解决方法,这样你就可以使用一个RedisTemplate和一个可以处理多种类型的序列化器 – 但是因为RedisSerializer不提供像boolean canDeserialize(..)这样的方法(如Spring MVC中的HTTP MessageConverters有)这似乎不可能。

因此,您似乎无法拥有多个RedisTemplate实例。

一点旧线程,但你可以做这样的事情:

         

然后在你的Java类中

 @Autowire private RedisTemplate redisTemplate; public void save(Model model) { ObjectMapper obmap = new ObjectMapper(); redisTemplate.opsForHash().putAll(mode.getId(), obmap.convertValue(model, Map.class)); }