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的主要内容,如果未能解决你的问题,请参考以下文章

秒杀思路: yii2加Redis实现秒杀

redis 如何存一个PHP数组 代码怎么写呢

redis怎么存数组和获取数组?

使用laravel的redis怎么存数组

一个 Redis 实例最多能存放多少的 keys?ListSet Sorted Set 他们最多能存放多少元素?

map里面存放一个list,list里面存放map,用freemarker模版怎么设置,将数据与模版组合时取出里面的数据