redis中list怎么存储对象

互联网 19-6-22

如果需要用到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<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;         }     } }

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

更多Redis相关技术文章,请访问Redis教程栏目进行学习!

以上就是redis中list怎么存储对象的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 存储对象
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:redis怎么存储对象

相关资讯