Jedis和JAVA對象的序列化和反序列化的使用

1. Jedis版本: jedis-2.6.2.jarjava

    背景:如今系統提供portal接口服務,使用JDBC直接查詢數據庫,使用jedis提供的緩存功能,在JDBC前面加上Redis,先從Redis中查詢數據,若是Redis中沒有該數據,就從數據庫中查詢,再把查詢到的結果放入Redis中,下次再請求該接口的時候,就直接返回Redis中的數據。redis

2. 序列化和反序列化的使用數據庫

    接口查詢到的數據是一個List集合,把集合對象經過序列化爲字符串,放入到Redis中。使用的時候取出Redis中的數據,經過反序列化爲對象使用。緩存

3. 下面是Redis和JAVA對象序列化和反序列化的應用實例服務器

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.druid.util.StringUtils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public final class RedisUtil {
    
    //Redis服務器IP
    private static String ADDR = "192.168.7.182";
    
    //Redis的端口號
    private static int PORT = 6379;
    
    //訪問密碼
    private static String AUTH = "admin";
    
    //可用鏈接實例的最大數目,默認值爲8;
    //若是賦值爲-1,則表示不限制;若是pool已經分配了maxActive個jedis實例,則此時pool的狀態爲exhausted(耗盡)。
    private static int MAX_ACTIVE = 1024;
    
    //控制一個pool最多有多少個狀態爲idle(空閒的)的jedis實例,默認值也是8。
    private static int MAX_IDLE = 200;
    
    //等待可用鏈接的最大時間,單位毫秒,默認值爲-1,表示永不超時。若是超過等待時間,則直接拋出JedisConnectionException;
    private static int MAX_WAIT = 10000;
    
    private static int TIMEOUT = 10000;
    
    //在borrow一個jedis實例時,是否提早進行validate操做;若是爲true,則獲得的jedis實例均是可用的;
    private static boolean TEST_ON_BORROW = true;
    
    private static JedisPool jedisPool = null;
    
    /**
     * 初始化Redis鏈接池
     */
    static {
        try {
            JedisPoolConfig config = new JedisPoolConfig();
            //config.setMaxActive(MAX_ACTIVE);
            config.setMaxIdle(MAX_IDLE);
            //config.setMaxWait(MAX_WAIT);
            config.setTestOnBorrow(TEST_ON_BORROW);
            //使用Redis密碼
            //jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);
            //不使用Redis密碼
            jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 獲取Jedis實例
     * @return
     */
    public synchronized static Jedis getJedis() {
        try {
            if (jedisPool != null) {
                Jedis resource = jedisPool.getResource();
                return resource;
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * 釋放jedis資源
     * @param jedis
     */
    public static void returnResource(final Jedis jedis) {
        if (jedis != null) {
            jedisPool.returnResource(jedis);
        }
    }
    
    //對象序列化爲字符串
    public static String objectSerialiable(Object obj){
        String serStr = null;
        try {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);  
            objectOutputStream.writeObject(obj);    
            serStr = byteArrayOutputStream.toString("ISO-8859-1");  
            serStr = java.net.URLEncoder.encode(serStr, "UTF-8");  
              
            objectOutputStream.close();  
            byteArrayOutputStream.close();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return serStr;
    }
    
    //字符串反序列化爲對象
    public static Object objectDeserialization(String serStr){
        Object newObj = null;
        try {
            String redStr = java.net.URLDecoder.decode(serStr, "UTF-8");  
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(redStr.getBytes("ISO-8859-1"));  
            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);   
            newObj = objectInputStream.readObject();
            objectInputStream.close();  
            byteArrayInputStream.close();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return newObj;
    }
    
    //測試
    public static void main(String[] args) {
        //構造一個list
        List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();  
        HashMap<String, String> map = new HashMap<String, String>();  
        map.put("number", "王小二");  
        map.put("name", "王二");  
        list.add(map);  
        HashMap<String, String> map2 = new HashMap<String, String>();  
        map2.put("number", "張三");  
        map2.put("name", "張小三");  
        list.add(map2);
        
        //將對象序列化爲字符串
        String serStr = objectSerialiable(list);
        System.out.println(serStr);
        
        //將序列化以後的字符串保存在redis中
        RedisUtil.getJedis().set("list", serStr);
        
        
        //從redis中取中字符串
        String deSerStr = RedisUtil.getJedis().get("list");
        if(!StringUtils.isEmpty(deSerStr)){
            //將取出的字符串反序列化爲對象
            List<HashMap<String, String>> deList = (List<HashMap<String, String>>) objectDeserialization(deSerStr);
            if(deList!=null && deList.size()>0){
                for(Map m : deList){
                    System.out.println(m.get("number")+"   "+m.get("name"));
                }
            }
        }
        
    }
}

 4.程序運行結果測試

這是對象序列化以後的字符串
%C2%AC%C3%AD%00%05sr%00%13java.util.ArrayListx%C2%81%C3%92%1D%C2%99%C3%87a%C2%9D%03%00%01I%00%04sizexp%00%00%00%02w%04%00%00%00%0Asr%00%11java.util.HashMap%05%07%C3%9A%C3%81%C3%83%16%60%C3%91%03%00%02F%00%0AloadFactorI%00%09thresholdxp%3F%40%00%00%00%00%00%0Cw%08%00%00%00%10%00%00%00%02t%00%04namet%00%06%C3%A7%C2%8E%C2%8B%C3%A4%C2%BA%C2%8Ct%00%06numbert%00%09%C3%A7%C2%8E%C2%8B%C3%A5%C2%B0%C2%8F%C3%A4%C2%BA%C2%8Cxsq%00%7E%00%02%3F%40%00%00%00%00%00%0Cw%08%00%00%00%10%00%00%00%02q%00%7E%00%04t%00%09%C3%A5%C2%BC%C2%A0%C3%A5%C2%B0%C2%8F%C3%A4%C2%B8%C2%89q%00%7E%00%06t%00%06%C3%A5%C2%BC%C2%A0%C3%A4%C2%B8%C2%89xx
這是經過字符串反序列化爲對象以後的輸出 王小二 王二 張三 張小三
相關文章
相關標籤/搜索