zoukankan      html  css  js  c++  java
  • [转] Redis 存储List对象

      如果需要用到Redis存储List对象,而list又不需要进行操作,可以按照MC的方式进行存储,不过Jedis之类的客户端没有提供API,可以有两种思路实现:

    1.      分别序列化 elements ,然后 set 存储

    2.    序列化List对象,set存储

    这两种方法都类似MC Object方法存储,运用这种方式意味着放弃RedisList提供的操作方法。

    import net.spy.memcached.compat.CloseUtil;
    import net.spy.memcached.compat.log.Logger;
    import net.spy.memcached.compat.log.LoggerFactory;
    import redis.clients.jedis.Client;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    
    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    /**
     * Created by IntelliJ IDEA.
     * User: lifeng.xu
     * Date: 12-6-11
     * Time: 上午11:10
     * To change this template use File | Settings | File Templates.
     */
    public class JedisTest {
    
        private static Logger logger = LoggerFactory.getLogger(JedisTest.class);
    
        /**
         * Jedis Pool for Jedis Resource
         * @return
         */
        public static JedisPool buildJedisPool(){
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxActive(1);
            config.setMinIdle(50);
            config.setMaxIdle(3000);
            config.setMaxWait(5000);
            JedisPool jedisPool = new JedisPool(config,
                    "*****", ****);
            return jedisPool;
        }
    
        /**
         * Test Data
         * @return
         */
        public static List<User> buildTestData(){
            User a = new User();
            a.setName("a");
            User b = new User();
            b.setName("b");
            List<User> list = new ArrayList<User>();
            list.add(a);
            list.add(b);
            return list;
        }
    
        /**
         * Test for
         */
        public static void testSetElements(){
            List<User> testData = buildTestData();
            Jedis jedis = buildJedisPool().getResource();
            String key = "testSetElements" + new Random(1000).nextInt();
            jedis.set(key.getBytes(), ObjectsTranscoder.serialize(testData));
    
            //验证
            byte[] in = jedis.get(key.getBytes());
            List<User> list = ObjectsTranscoder.deserialize(in);
            for(User user : list){
                System.out.println("testSetElements user name is:" + user.getName());
            }
        }
    
        public static void testSetEnsemble(){
            List<User> testData = buildTestData();
            Jedis jedis = buildJedisPool().getResource();
            String key = "testSetEnsemble" + new Random(1000).nextInt();
            jedis.set(key.getBytes(), ListTranscoder.serialize(testData));
    
            //验证
            byte[] in = jedis.get(key.getBytes());
            List<User> list = (List<User>)ListTranscoder.deserialize(in);
            for(User user : list){
                System.out.println("testSetEnsemble user name is:" + user.getName());
            }
        }
    
        public static void main(String[] args) {
            testSetElements();
            testSetEnsemble();
        }
    
        public static void close(Closeable closeable) {
            if (closeable != null) {
                try {
                    closeable.close();
                } catch (Exception e) {
                    logger.info("Unable to close %s", closeable, e);
                }
            }
        }
    
        static class User implements Serializable{
            String name;
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
        }
    
        static class ObjectsTranscoder{
            
            public static byte[] serialize(List<User> value) {
                if (value == null) {
                    throw new NullPointerException("Can't serialize null");
                }
                byte[] rv=null;
                ByteArrayOutputStream bos = null;
                ObjectOutputStream os = null;
                try {
                    bos = new ByteArrayOutputStream();
                    os = new ObjectOutputStream(bos);
                    for(User user : value){
                        os.writeObject(user);
                    }
                    os.writeObject(null);
                    os.close();
                    bos.close();
                    rv = bos.toByteArray();
                } catch (IOException e) {
                    throw new IllegalArgumentException("Non-serializable object", e);
                } finally {
                    close(os);
                    close(bos);
                }
                return rv;
            }
    
            public static List<User> deserialize(byte[] in) {
                List<User> list = new ArrayList<User>();
                ByteArrayInputStream bis = null;
                ObjectInputStream is = null;
                try {
                    if(in != null) {
                        bis=new ByteArrayInputStream(in);
                        is=new ObjectInputStream(bis);
                        while (true) {
                            User user = (User) is.readObject();
                            if(user == null){
                                break;
                            }else{
                                list.add(user);
                            }
                        }
                        is.close();
                        bis.close();
                    }
                } catch (IOException e) {
                    logger.warn("Caught IOException decoding %d bytes of data",
                            in == null ? 0 : in.length, e);
                } catch (ClassNotFoundException e) {
                    logger.warn("Caught CNFE decoding %d bytes of data",
                            in == null ? 0 : in.length, e);
                } finally {
                    CloseUtil.close(is);
                    CloseUtil.close(bis);
                }
                return list;
            }
        }
        
        static class ListTranscoder{
            public static byte[] serialize(Object value) {
                if (value == null) {
                    throw new NullPointerException("Can't serialize null");
                }
                byte[] rv=null;
                ByteArrayOutputStream bos = null;
                ObjectOutputStream os = null;
                try {
                    bos = new ByteArrayOutputStream();
                    os = new ObjectOutputStream(bos);
                    os.writeObject(value);
                    os.close();
                    bos.close();
                    rv = bos.toByteArray();
                } catch (IOException e) {
                    throw new IllegalArgumentException("Non-serializable object", e);
                } finally {
                    close(os);
                    close(bos);
                }
                return rv;
            }
    
            public static Object deserialize(byte[] in) {
                Object rv=null;
                ByteArrayInputStream bis = null;
                ObjectInputStream is = null;
                try {
                    if(in != null) {
                        bis=new ByteArrayInputStream(in);
                        is=new ObjectInputStream(bis);
                        rv=is.readObject();
                        is.close();
                        bis.close();
                    }
                } catch (IOException e) {
                    logger.warn("Caught IOException decoding %d bytes of data",
                            in == null ? 0 : in.length, e);
                } catch (ClassNotFoundException e) {
                    logger.warn("Caught CNFE decoding %d bytes of data",
                            in == null ? 0 : in.length, e);
                } finally {
                    CloseUtil.close(is);
                    CloseUtil.close(bis);
                }
                return rv;
            }
        }
    }
    

    PSRedsi中存储list没有封装对ObjectAPI,是不是也是倾向于只存储用到的字段,而不是存储Object本身呢?Redis是一个In-Mem的产品,会觉得我们应用的方式。

    原链接:http://www.thinksaas.cn/topics/0/515/515831.html

  • 相关阅读:
    java传递String参数
    C++ string与int的互相转换
    java插入排序
    凸包Graham Scan算法实现
    求平面上N点最远两点和最近两点距离
    求最大公约数
    n个数连接得到最小或最大的多位整数(携程)
    Java快排
    背包问题
    二分查找离左边元素最近的(可以等于)
  • 原文地址:https://www.cnblogs.com/chenyj/p/6880605.html
Copyright © 2011-2022 走看看