最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

redis中list怎么存储对象

来源:懂视网 责编:小采 时间:2020-11-09 06:57:51
文档

redis中list怎么存储对象

redis中list怎么存储对象:如果需要用到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对象,而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怎么存储对象

redis中list怎么存储对象:如果需要用到Redis存储List对象,而list又不需要进行操作,可以按照MC的方式进行存储,不过Jedis之类的客户端没有提供API,可以有两种思路实现:1. 分别序列化 elements ,然后 set 存储2. 序列化List对象,set存储这两种方法都类似MC的 Object方
推荐度:
标签: 保存 存储 对象
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top