http://blog.csdn.net/gstormspire/article/details/7653095
如果需要用到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;
- }
- }
- }
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存储List集合”指的是使用Redis数据库来存储列表数据结构。Redis是一个开源的、高性能的键值存储系统,支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等。在这个示例中,重点是利用Redis...
JOhm 是一个 Java 的对象哈希映射库,用于在 Redis 中存储对象约翰JOhm 是一个速度超快的 Java 对象哈希映射库,其灵感来自超棒的Ohm。JOhm OHM 是 Hibernate 等旧 ORM 的现代化身,不同之处在于我们这里处理的不是 ...
在本项目中,我们关注的是Redis如何处理对象(obj)和列表(list)的增删操作,以及如何结合Spring框架进行集成使用。下面我们将深入探讨这两个主题。 首先,让我们了解Redis中的对象存储。在Redis中,对象可以被...
- **内存存储与持久化**:虽然 Redis 主要在内存中运行以确保高性能,但它也提供了多种持久化策略,如 RDB 快照和 AOF(Append Only File)日志,以防止数据丢失。 - **主从同步**:支持主从架构,可以进行数据同步...
这些工具可能包括序列化/反序列化方法,用于将Java对象转换为适合Redis存储的字节码格式,以及压缩和解压缩方法。 - 这样的工具类能够帮助开发者更高效地与 Redis 交互,提高代码的可读性和可维护性,同时降低出错...
1. **存储数据**:Redis支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。例如,存储一个字符串键值对: ```csharp var db = redis.GetDatabase(); db...
接下来是Hash类型,它允许我们将多个键值对存储在同一个Redis键中,适合存储具有多个字段的对象。使用Hash类型可以更细粒度地管理数据,避免了数据的冗余存储。例如,使用以下代码来操作Hash类型数据: ```csharp ...
- **哈希(Hash)**:键值对的集合,适合存储对象。每个键对应一个字段,值是另一个键值对。 - **列表(List)**:双向链表结构,支持LPOP、RPOP、LPUSH、RPUSH等操作,常用于实现消息队列。 - **集合(Set)**:...
2. **Redis数据类型操作**:C#中可以操作Redis的多种数据类型,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。例如,使用`StringSet`和`StringGet`方法操作字符串,`...
- **哈希(Hash)**:用于存储键值对集合,适用于存储对象。 - **列表(List)**:有序的元素集合,支持两端插入和弹出元素。 - **集合(Set)**:无序的不重复元素集合,支持成员的添加、删除、检查等操作。 - **有序...
6. **序列化**:库内置了对多种序列化器的支持,包括Json.NET、protobuf等,这使得在Redis中存储和检索对象变得容易。 7. **高级功能**:如脚本(Lua Scripting)支持,可以执行预编译的Lua脚本来提高性能,以及...
散列(Hash):键值对集合,适合存储对象。每个散列可以存储多个字段和值之间的映射。 集合(Set):无序集合,用于存储多个不重复的字符串元素,支持集合间的交集、并集和差集等操作。 有序集合(Sorted Set):与...
本篇文章将深入探讨如何通过Java代码在Redis缓存数据库中存储和检索数据,以及项目配置中需注意的关键点。 首先,为了在Java项目中使用Redis,我们需要在项目配置文件(如`application.properties`或`application....
哈希表是一种键值对的存储结构,特别适合存储对象。每个键对应一个字段,值为该字段的值。Redis 提供了 `HSET` 用于设置键值对,`HGET` 获取单个值,`HGETALL` 获取所有键值对,`HDEL` 删除指定字段,以及 `HINCRBY...
以上只是Redis命令参考手册中的一部分内容,完整的CHM文档包含了更详尽的命令介绍、参数解析和使用示例,对于深入理解和使用Redis有着极大的帮助。无论你是初学者还是经验丰富的开发者,这份中文版的Redis命令参考...
- **键值存储**: Redis 是一种键值存储类型的 NoSQL 数据库,提供高性能的键值存储服务。 - **支持的数据类型**: - `String`: 普通的字符串类型。 - `Hash`: 类似 Map 的结构,适合存储对象。 - `List`: 类似链表...
字符串是Redis中最基本的数据类型,它能够存储任何形式的字符串,包括二进制数据、数字甚至是图片。 - set命令可以用于字符串设置,setnx命令用于只有当key不存在时才设置。 - get命令用于获取key对应的值。 - mset...
在实际应用中,Redis的这四种数据类型可以根据需求灵活组合,比如使用List实现发布订阅、使用Set做唯一性校验、使用Hash存储用户信息等。了解并熟练掌握这些基本操作,有助于提升Java应用的性能和可扩展性。 在`...