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<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;         }     } }</user></user></user></user></user></user></user></user></user></user></user></user>

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

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

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享