视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
redis中list怎么存储对象
2020-11-09 06:57:51 责编:小采
文档

如果需要用到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教程栏目进行学习!

下载本文
显示全文
专题