Spring-data-redis;存儲對象實例

Spring-data-redis: serializer實例           java

 

     spring-data-redis提供了多種serializer策略,這對使用jedis的開發者而言,實在是很是便捷。sdr提供了4種內置的serializer:redis

  • JdkSerializationRedisSerializer:使用JDK的序列化手段(serializable接口,ObjectInputStrean,ObjectOutputStream),數據以字節流存儲
  • StringRedisSerializer:字符串編碼,數據以string存儲
  • JacksonJsonRedisSerializer:json格式存儲
  • OxmSerializer:xml格式存儲

    其中JdkSerializationRedisSerializer和StringRedisSerializer是最基礎的序列化策略,其中「JacksonJsonRedisSerializer」與「OxmSerializer」都是基於stirng存儲,所以它們是較爲「高級」的序列化(最終仍是使用string解析以及構建java對象)。spring

    RedisTemplate中須要聲明4種serializer,默認爲「JdkSerializationRedisSerializer」:json

    1) keySerializer :對於普通K-V操做時,key採起的序列化策略
    2) valueSerializer:value採起的序列化策略
    3) hashKeySerializer: 在hash數據結構中,hash-key的序列化策略
    4) hashValueSerializer:hash-value的序列化策略數據結構

    不管如何,建議key/hashKey採用StringRedisSerializer。app

    接下來,經過實例描述如何使用它們,能夠首先參考「spring-data-redis特性」:工具

 

一. JdkSerializationRedisSerializer/StringRedisSerializerthis

    1) spring配置文件編碼

Java代碼 複製代碼  收藏代碼
  1. <bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">  
  2.     <property name="connectionFactory" ref="jedisConnectionFactory"></property>  
  3.     <property name="keySerializer">  
  4.         <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>  
  5.     </property>  
  6.     <property name="hashKeySerializer">  
  7.         <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>  
  8.     </property>  
  9.     <property name="valueSerializer">  
  10.         <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>  
  11.     </property>  
  12.     <property name="hashValueSerializer">  
  13.         <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>  
  14.     </property>  
  15. </bean>  
<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) 程序實例:spa

Java代碼 複製代碼  收藏代碼
  1. ValueOperations<String, User> valueOper = redisTemplate.opsForValue();  
  2. User user = new User("zhangsan",12);  
  3. valueOper.set("user:1", user);  
  4. System.out.println(valueOper.get("user:1").getName());  
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配置:

Java代碼 複製代碼  收藏代碼
  1. <bean id="jsonSerializer" class="com.sample.redis.sdr.JsonRedisSerializer"/>  
  2. <bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">  
  3.     <property name="connectionFactory" ref="jedisConnectionFactory"></property>  
  4.     <property name="defaultSerializer">  
  5.         <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>  
  6.     </property>  
  7. </bean>  
<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) 程序實例:

Java代碼 複製代碼  收藏代碼
  1. /** 
  2. * 不使用sdr自帶的json序列化工具,一切操做基於string 
  3. **/  
  4. public class JsonRedisSeriaziler{  
  5.     public static final String EMPTY_JSON = "{}";  
  6.       
  7.     public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");  
  8.       
  9.     protected ObjectMapper objectMapper = new ObjectMapper();  
  10.     public JsonRedisSeriaziler(){}  
  11.       
  12.     /** 
  13.      * java-object as json-string 
  14.      * @param object 
  15.      * @return  
  16.      */  
  17.     public String seriazileAsString(Object object){  
  18.         if (object== null) {  
  19.             return EMPTY_JSON;  
  20.         }  
  21.         try {  
  22.             return this.objectMapper.writeValueAsString(object);  
  23.         } catch (Exception ex) {  
  24.             throw new SerializationException("Could not write JSON: " + ex.getMessage(), ex);  
  25.         }  
  26.     }  
  27.       
  28.     /** 
  29.      * json-string to java-object 
  30.      * @param str 
  31.      * @return  
  32.      */  
  33.     public <T> T deserializeAsObject(String str,Class<T> clazz){  
  34.         if(str == null || clazz == null){  
  35.             return null;  
  36.         }  
  37.         try{  
  38.             return this.objectMapper.readValue(str, clazz);  
  39.         }catch (Exception ex) {  
  40.             throw new SerializationException("Could not write JSON: " + ex.getMessage(), ex);  
  41.         }  
  42.     }  
  43.   
  44. }  
/**
* 不使用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);
		}
	}

}
Java代碼 複製代碼  收藏代碼
  1. public class RedisClientTest {  
  2.   
  3.     private JsonRedisSeriaziler seriaziler;  
  4.       
  5.     private RedisTemplate redisTemplate;  
  6.   
  7.     public void setSeriaziler(JsonRedisSeriaziler seriaziler) {  
  8.         this.seriaziler = seriaziler;  
  9.     }  
  10.   
  11.     public void setRedisTemplate(RedisTemplate redisTemplate) {  
  12.         this.redisTemplate = redisTemplate;  
  13.     }  
  14.       
  15.       
  16.     public void insertUser(User user){  
  17.         ValueOperations<String, String> operations = redisTemplate.opsForValue();  
  18.         operations.set("user:" + user.getName(), seriaziler.seriazileAsString(user));  
  19.     }  
  20.       
  21.     public User getUser(String name){  
  22.         ValueOperations<String, String> operations = redisTemplate.opsForValue();  
  23.         String json = operations.get("user:" + name);  
  24.         return seriaziler.deserializeAsObject(json, User.class);  
  25.     }  
  26. }  
相關文章
相關標籤/搜索