redis中list怎么存储对象
Redis  /  管理员 发布于 7年前   176
如果需要用到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怎么存储对象的详细内容,更多请关注其它相关文章!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号