前幾天被問到這樣一個問題,redis怎麼存對象,平時也沒怎麼注意,只知道redis存字符之類的,不過就是根據鍵存取值,不過對象的話仍是不一樣的java
首先來了解一下爲何要實現序列化redis
爲何要實現序列化接口網絡
當一個類實現了Serializable接口(該接口僅爲標記接口,不包含任何方法定義),表示該類能夠序列化.序列化的目的是將一個實現了Serializable接口的對象轉換成一個字節序列,能夠。 把該字節序列保存起來(例如:保存在一個文件裏),之後能夠隨時將該字節序列恢復爲原來的對象。甚至能夠將該字節序列放到其餘計算機上或者經過網絡傳輸到其餘計算機上恢復,只要該計 算機平臺存在相應的類就能夠正常恢復爲原來的對象。 實現:要序列化一個對象,先要建立某些OutputStream對象,而後將其封裝在一個ObjectOutputStream對象內,再調用writeObject()方法便可序列化一個對象;反序列化也相似。
注意:使用對象流寫入到文件是不只要保證該對象是序列化的,並且該對象的成員對象也必須是序列化的spa
關於Serializable接口的類中的serialVersionUID:
serialVersionUID是long類型的。在Eclipse中有兩種生成方式:
默認的是1L:
private static final long serialVersionUID = 1L;
另一個則是根據類名、接口名、成員方法以及屬性等生成一個64位的哈希字段:
private static final long serialVersionUID = 3969438177161438988L;
serialVersionUID主要是爲了解決對象反序列化的兼容性問題。
若是沒有提供serialVersionUID,對象序列化後存到硬盤上以後,再增長或減小類的filed。這樣,當反序列化時,就會出現Exception,形成不兼容問題。
但當serialVersionUID相同時,它就會將不同的field以type的缺省值反序列化。這樣就能夠避開不兼容問題了。code
以上方式只能恢復成Java對象,若是想要恢復成其餘對象(如C++對象),那就要將Java對象轉換爲XML格式,這樣可使其被各類平臺和各類語言使用。可使用隨JDK一塊兒發佈的javax.xam.*類庫,或者使用開源XOM類庫(能夠從www.xom.nu下載並得到文檔)。對象
接下來看看redis是怎麼存對象的blog
package Object1; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import bean.Person; import redis.clients.jedis.Jedis; public class SerializeUtil { public static void main(String [] args){ Jedis jedis = new Jedis("172.16.135.2"); String keys = "name"; // 刪數據 //jedis.del(keys); // 存數據 jedis.set(keys, "zy"); // 取數據 String value = jedis.get(keys); System.out.println(value); //存對象 Person p=new Person(); //peson類記得實現序列化接口 Serializable p.setAge(20); p.setName("姚波"); p.setId(1); jedis.set("person".getBytes(), serialize(p)); byte[] byt=jedis.get("person".getBytes()); Object obj=unserizlize(byt); if(obj instanceof Person){ System.out.println(obj); } } //序列化 public static byte [] serialize(Object obj){ ObjectOutputStream obi=null; ByteArrayOutputStream bai=null; try { bai=new ByteArrayOutputStream(); obi=new ObjectOutputStream(bai); obi.writeObject(obj); byte[] byt=bai.toByteArray(); return byt; } catch (IOException e) { e.printStackTrace(); } return null; } //反序列化 public static Object unserizlize(byte[] byt){ ObjectInputStream oii=null; ByteArrayInputStream bis=null; bis=new ByteArrayInputStream(byt); try { oii=new ObjectInputStream(bis); Object obj=oii.readObject(); return obj; } catch (Exception e) { e.printStackTrace(); } return null; } }