我正在使用Spring Redis支持在Redis中保存我的对象。
我有几个处理不同Model类的DAO:
例如:'ShopperHistoryDao'将保存/检索'ShopperHistoryModel'的对象 'ShopperItemHistoryDao'将处理'ItemHistoryModel'
的对象我想使用'JacksonJsonRedisSerializer'将对象序列化/反序列化为json。
但是在JacksonJsonRedisSerializer的构造函数中,它需要一个特定的Model类。
JacksonJsonRedisSerializer(Class<T> type)
这是否意味着,我必须为每个不同的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>
答案 0 :(得分:17)
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;
}
这会将 @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
答案 1 :(得分:4)
是的,RedisTemplate
似乎设计为具有值序列化程序的单个实例。
我打算建议使用包含内部序列化程序映射的RedisSerializer
的可能解决方法,这样您就可以使用一个RedisTemplate
和一个可以处理多种类型的序列化程序 - 但是从{{1不提供像RedisSerializer
这样的方法(就像Spring MVC中的HTTP MessageConverters一样),这似乎不太可能。
所以看起来你很难有多个boolean canDeserialize(..)
个实例。
答案 2 :(得分:1)
一些旧线程,但你可以这样做:
<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));
}