1. 程式人生 > >redis儲存物件和值

redis儲存物件和值

redis主要儲存型別最常用的五種資料型別:

String

Hash

List

Set

Sorted set

redis儲存物件序列化和反序列化

首先來了解一下為什麼要實現序列化

實現序列化介面的原因

   當一個類實現了Serializable介面(該介面僅為標記介面,不包含任何方法定義),表示該類可以序列化.序列化的目的是將一個實現了Serializable介面的物件轉換成一個位元組序列,可以。 把該位元組序列儲存起來(例如:儲存在一個檔案裡),以後可以隨時將該位元組序列恢復為原來的物件。甚至可以將該位元組序列放到其他計算機上或者通過網路傳輸到其他計算機上恢復,只要該計 算機平臺存在相應的類就可以正常恢復為原來的物件。 實現:要序列化一個物件,先要建立某些OutputStream物件,然後將其封裝在一個ObjectOutputStream物件內,再呼叫writeObject()方法即可序列化一個物件;反序列化也類似。


注意:使用物件流寫入到檔案是不僅要保證該物件是序列化的,而且該物件的成員物件也必須是序列化的

關於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的預設值反序列化。這樣就可以避開不相容問題了。

以上方式只能恢復成Java物件,如果想要恢復成其他物件(如C++物件),那就要將Java物件轉換為XML格式,這樣可以使其被各種平臺和各種語言使用。可以使用隨JDK一起釋出的javax.xam.*類庫,或者使用開源XOM類庫(可以從www.xom.nu下載並獲得文件)。

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(30);
        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;
    }
}