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配置文件編碼
- <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>
<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
- 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());
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>
<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);
- }
- }
- }
/** * 不使用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);
- }
- }