重庆小潘seo博客

当前位置:首页 > 重庆网络营销 > 小潘杂谈 >

小潘杂谈

redis中list怎么存储对象

时间:2020-09-22 19:00:06 作者:重庆seo小潘 来源:
如果需要用到Redis存储List对象,而list又不需要进行操作,可以按照MC的方式进行存储,不过Jedis之类的客户端没有提供API,可以有两种思路实现: 1.分别序列化 elements ,然后 set 存储 2.序列化List对象,set存储 这两种方法都类似MC的 Object方法存储,运

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

更多Redis相关技术文章,请访问Redis教程栏目进行学习!以上就是redis中list怎么存储对象的详细内容,更多请关注小潘博客其它相关文章!