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接口。

扫描二维码关注公众号,回复: 604861 查看本文章

二.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相关文档。

  • 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相关文档。

猜你喜欢

转载自shift-alt-ctrl.iteye.com/blog/1887370