簡體   English   中英

Spring RedisTemplate:將多個模型類序列化為 JSON。需要使用多個 RedisTemplates?

[英]Spring RedisTemplate : Serialise multiple Model classes into JSON.Need to use Multiple RedisTemplates?

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

我有幾個處理不同模型類的 DAO:

例如, ShopperHistoryDao保存/檢索ShopperHistoryModel對象, ShopperItemHistoryDao保存/檢索ItemHistoryModel對象。

我想使用JacksonJsonRedisSerializer將我的對象序列化/反序列化到/從 json。

但是在 JacksonJsonRedisSerializer 的構造函數中,它需要一個特定的 Model 類。

JacksonJsonRedisSerializer(Class<T> type)

這是否意味着,我必須為每個不同的 Model 類配置單獨的RedisTemplates並在適當的 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>

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

這將向 JSON 添加@Class屬性以了解類型,這有助於 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似乎被設計為具有值序列化程序的單個實例。

我打算建議使用包含內部序列化器 Map 的RedisSerializer的可能解決方法,以便您可以將一個RedisTemplate與可以處理多種類型的序列化器一起使用 - 但由於RedisSerializer不提供像boolean canDeserialize(..)這樣的方法(如Spring MVC 中的 HTTP MessageConverters 有)這似乎不可能。

因此,您似乎堅持擁有多個RedisTemplate實例。

有點舊線程,但您可以執行以下操作:

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

然后在你的 Java 類中

@Autowire
private RedisTemplate redisTemplate;

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM