您好,欢迎来到智榕旅游。
搜索
您的当前位置:首页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;
 }
 }
}

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

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

Copyright © 2019- zrrp.cn 版权所有 赣ICP备2024042808号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务