Jedis和JAVA對象的序列化和還原序列化的使用

來源:互聯網
上載者:User

標籤:

1. Jedis版本: jedis-2.6.2.jar

    背景:現在系統提供portal介面服務,使用JDBC直接查詢資料庫,使用jedis提供的緩衝功能,在JDBC前面加上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
這是通過字串還原序列化為對象之後的輸出王小二 王二張三 張小三

 

Jedis和JAVA對象的序列化和還原序列化的使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.