• Jedis和JAVA对象的序列化和反序列化的使用


    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
    这是通过字符串反序列化为对象之后的输出 王小二 王二 张三 张小三
  • 相关阅读:
    计算与软件工程 作业三
    计算与软件工程 作业二
    计算与软件工程 作业一
    计算与软件工程 作业六
    计算与软件工程 作业五
    计算与软件工程 作业四
    计算与软件工程 作业三
    计算与软件工程 作业二
    计算与软件工程 作业一
    第六次作业
  • 原文地址:https://www.cnblogs.com/liuchao102/p/4479352.html
Copyright © 2020-2023  润新知