[英]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.