redis怎么存放一个list
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis怎么存放一个list相关的知识,希望对你有一定的参考价值。
参考技术A 如果需要用到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;
本回答被提问者和网友采纳
Redis 如何封装成一个list,然后hset
参考技术A Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
以上是关于redis怎么存放一个list的主要内容,如果未能解决你的问题,请参考以下文章
一个 Redis 实例最多能存放多少的 keys?ListSet Sorted Set 他们最多能存放多少元素?
map里面存放一个list,list里面存放map,用freemarker模版怎么设置,将数据与模版组合时取出里面的数据