9AMC 发表于 2016-12-19 07:44:54

Spring-data-redis: serializer实例

  spring-data-redis提供了多种serializer策略,这对使用jedis的开发者而言,实在是非常便捷。sdr提供了4种内置的serializer:


[*]JdkSerializationRedisSerializer:使用JDK的序列化手段(serializable接口,ObjectInputStrean,ObjectOutputStream),数据以字节流存储
[*]StringRedisSerializer:字符串编码,数据以string存储
[*]JacksonJsonRedisSerializer:json格式存储
[*]OxmSerializer:xml格式存储
  其中JdkSerializationRedisSerializer和StringRedisSerializer是最基础的序列化策略,其中“JacksonJsonRedisSerializer”与“OxmSerializer”都是基于stirng存储,因此它们是较为“高级”的序列化(最终还是使用string解析以及构建java对象)。
  RedisTemplate中需要声明4种serializer,默认为“JdkSerializationRedisSerializer”:
  1) keySerializer :对于普通K-V操作时,key采取的序列化策略
    2) valueSerializer:value采取的序列化策略
    3) hashKeySerializer: 在hash数据结构中,hash-key的序列化策略
    4) hashValueSerializer:hash-value的序列化策略
  无论如何,建议key/hashKey采用StringRedisSerializer。
  接下来,通过实例描述如何使用它们,可以首先参考“spring-data-redis特性”:
  一. JdkSerializationRedisSerializer/StringRedisSerializer
  1) spring配置文件

<bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory"></property>
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="hashKeySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
</property>
<property name="hashValueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
</property>
</bean>
  2) 程序实例:

ValueOperations<String, User> valueOper = redisTemplate.opsForValue();
User user = new User("zhangsan",12);
valueOper.set("user:1", user);
System.out.println(valueOper.get("user:1").getName());
  其中User为pojo类,且需要实现Serializable接口。
  二.sdr与json
  1) spring配置:

<bean id="jsonSerializer" class="com.sample.redis.sdr.JsonRedisSerializer"/>
<bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory"></property>
<property name="defaultSerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
</bean>
  并没有在配置文件中,使用JacksonJsonRedisSerializer,因为这样实在是麻烦而且不灵活(主要是jackson需要ClassType)。我们将在java代码进行转换,因为通过java代码,使用jackson工具将json字符串转换成javabean是非常简单的。
  2) 程序实例:

/**
* 不使用sdr自带的json序列化工具,一切操作基于string
**/
public class JsonRedisSeriaziler{
public static final String EMPTY_JSON = "{}";
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
protected ObjectMapper objectMapper = new ObjectMapper();
public JsonRedisSeriaziler(){}
/**
* java-object as json-string
* @param object
* @return
*/
public String seriazileAsString(Object object){
if (object== null) {
return EMPTY_JSON;
}
try {
return this.objectMapper.writeValueAsString(object);
} catch (Exception ex) {
throw new SerializationException("Could not write JSON: " + ex.getMessage(), ex);
}
}
/**
* json-string to java-object
* @param str
* @return
*/
public <T> T deserializeAsObject(String str,Class<T> clazz){
if(str == null || clazz == null){
return null;
}
try{
return this.objectMapper.readValue(str, clazz);
}catch (Exception ex) {
throw new SerializationException("Could not write JSON: " + ex.getMessage(), ex);
}
}
}
public class RedisClientTest {
private JsonRedisSeriaziler seriaziler;
private RedisTemplate redisTemplate;
public void setSeriaziler(JsonRedisSeriaziler seriaziler) {
this.seriaziler = seriaziler;
}
public void setRedisTemplate(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}

public void insertUser(User user){
ValueOperations<String, String> operations = redisTemplate.opsForValue();
operations.set("user:" + user.getName(), seriaziler.seriazileAsString(user));
}
public User getUser(String name){
ValueOperations<String, String> operations = redisTemplate.opsForValue();
String json = operations.get("user:" + name);
return seriaziler.deserializeAsObject(json, User.class);
}
}
  三.sdr与xml
  实施办法可以参见本文“sdr与json”,同时参考spring-oxm相关文档。
页: [1]
查看完整版本: Spring-data-redis: serializer实例