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

Ash*_*iya 20 java serialization spring json redis

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

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

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

我想使用'JacksonJsonRedisSerializer'将对象序列化/反序列化为json.

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

JacksonJsonRedisSerializer(Class<T> type)
Run Code Online (Sandbox Code Playgroud)

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

就像是 :

<bean id="redisTemplateForShopperHistoryModel" class="org.springframework.data.redis.core.RedisTemplate">
    <property name="connectionFactory" ref="jedisConnectionFactory" />
    <property name="valueSerializer">
        <bean id="redisJsonSerializer" 
                        class="org.springframework.data.redis.serializer.JacksonJsonRedisSerializer">
            <constructor-arg type="java.lang.Class" value="ShopperHistoryModel.class"/>
        </bean>   
    </property>
</bean>


<bean id="redisTemplateForItemHistoryModel" class="org.springframework.data.redis.core.RedisTemplate">
    <property name="connectionFactory" ref="jedisConnectionFactory" />
    <property name="valueSerializer">
        <bean id="redisJsonSerializer" 
                        class="org.springframework.data.redis.serializer.JacksonJsonRedisSerializer">
            <constructor-arg type="java.lang.Class" value="ItemHistoryModel.class"/>
        </bean>   
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

Pra*_*nav 18

GenericJackson2JsonRedisSerializer应该完成这项工作

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());                                           
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
Run Code Online (Sandbox Code Playgroud)

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

"{\"@class\":\"com.prnv.model.WhitePaper\",\"title\":\"Hey\",\"author\":{\"@class\":\"com.prnv.model.Author\",\"name\":\"Hello\"},\"description\":\"Description\"}"
Run Code Online (Sandbox Code Playgroud)

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

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

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


mat*_*t b 5

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

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

因此,您似乎陷入了拥有多个RedisTemplate实例的困境。