千家信息网

redis中list存储对象的方法

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,小编给大家分享一下redis中list存储对象的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!如果需要用到Redis存
千家信息网最后更新 2025年01月21日redis中list存储对象的方法

小编给大家分享一下redis中list存储对象的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

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

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

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

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

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 buildTestData(){        User a = new User();        a.setName("a");        User b = new User();        b.setName("b");        List list = new ArrayList();        list.add(a);        list.add(b);        return list;    }    /**     * Test for     */    public static void testSetElements(){        List 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 list = ObjectsTranscoder.deserialize(in);        for(User user : list){            System.out.println("testSetElements user name is:" + user.getName());        }    }    public static void testSetEnsemble(){        List 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 list = (List)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 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 deserialize(byte[] in) {            List list = new ArrayList();            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;        }    }}

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

以上是redis中list存储对象的方法的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0