`

Redis存储List对象

 
阅读更多
版论坛全民公测!    “2012移动开发者大会参会感悟”有奖征文火热进行中    JavaEE参考示例SpringSide作者江南白衣专访



Redis 存储List对象
.
分类: NoSQL 2012-06-11 16:33243人阅读评论(0)收藏举报



       如果需要用到Redis存储List对象,而list又不需要进行操作,可以按照MC的方式进行存储,不过Jedis之类的客户端没有提供API,可以有两种思路实现:

1.      分别序列化 elements ,然后 set 存储

2.    序列化List对象,set存储

这两种方法都类似MC的 Object方法存储,运用这种方式意味着放弃Redis对List提供的操作方法。




[java] view plaincopyprint?
01.import net.spy.memcached.compat.CloseUtil; 
02.import net.spy.memcached.compat.log.Logger; 
03.import net.spy.memcached.compat.log.LoggerFactory; 
04.import redis.clients.jedis.Client; 
05.import redis.clients.jedis.Jedis; 
06.import redis.clients.jedis.JedisPool; 
07.import redis.clients.jedis.JedisPoolConfig; 
08. 
09.import java.io.*; 
10.import java.util.ArrayList; 
11.import java.util.List; 
12.import java.util.Random; 
13. 
14./**
15. * Created by IntelliJ IDEA.
16. * User: lifeng.xu
17. * Date: 12-6-11
18. * Time: 上午11:10
19. * To change this template use File | Settings | File Templates.
20. */ 
21.public class JedisTest { 
22. 
23.    private static Logger logger = LoggerFactory.getLogger(JedisTest.class); 
24. 
25.    /**
26.     * Jedis Pool for Jedis Resource
27.     * @return
28.     */ 
29.    public static JedisPool buildJedisPool(){ 
30.        JedisPoolConfig config = new JedisPoolConfig(); 
31.        config.setMaxActive(1); 
32.        config.setMinIdle(50); 
33.        config.setMaxIdle(3000); 
34.        config.setMaxWait(5000); 
35.        JedisPool jedisPool = new JedisPool(config, 
36.                "*****", ****); 
37.        return jedisPool; 
38.    } 
39. 
40.    /**
41.     * Test Data
42.     * @return
43.     */ 
44.    public static List<User> buildTestData(){ 
45.        User a = new User(); 
46.        a.setName("a"); 
47.        User b = new User(); 
48.        b.setName("b"); 
49.        List<User> list = new ArrayList<User>(); 
50.        list.add(a); 
51.        list.add(b); 
52.        return list; 
53.    } 
54. 
55.    /**
56.     * Test for
57.     */ 
58.    public static void testSetElements(){ 
59.        List<User> testData = buildTestData(); 
60.        Jedis jedis = buildJedisPool().getResource(); 
61.        String key = "testSetElements" + new Random(1000).nextInt(); 
62.        jedis.set(key.getBytes(), ObjectsTranscoder.serialize(testData)); 
63. 
64.        //验证 
65.        byte[] in = jedis.get(key.getBytes()); 
66.        List<User> list = ObjectsTranscoder.deserialize(in); 
67.        for(User user : list){ 
68.            System.out.println("testSetElements user name is:" + user.getName()); 
69.        } 
70.    } 
71. 
72.    public static void testSetEnsemble(){ 
73.        List<User> testData = buildTestData(); 
74.        Jedis jedis = buildJedisPool().getResource(); 
75.        String key = "testSetEnsemble" + new Random(1000).nextInt(); 
76.        jedis.set(key.getBytes(), ListTranscoder.serialize(testData)); 
77. 
78.        //验证 
79.        byte[] in = jedis.get(key.getBytes()); 
80.        List<User> list = (List<User>)ListTranscoder.deserialize(in); 
81.        for(User user : list){ 
82.            System.out.println("testSetEnsemble user name is:" + user.getName()); 
83.        } 
84.    } 
85. 
86.    public static void main(String[] args) { 
87.        testSetElements(); 
88.        testSetEnsemble(); 
89.    } 
90. 
91.    public static void close(Closeable closeable) { 
92.        if (closeable != null) { 
93.            try { 
94.                closeable.close(); 
95.            } catch (Exception e) { 
96.                logger.info("Unable to close %s", closeable, e); 
97.            } 
98.        } 
99.    } 
100. 
101.    static class User implements Serializable{ 
102.        String name; 
103. 
104.        public String getName() { 
105.            return name; 
106.        } 
107. 
108.        public void setName(String name) { 
109.            this.name = name; 
110.        } 
111.    } 
112. 
113.    static class ObjectsTranscoder{ 
114.         
115.        public static byte[] serialize(List<User> value) { 
116.            if (value == null) { 
117.                throw new NullPointerException("Can't serialize null"); 
118.            } 
119.            byte[] rv=null; 
120.            ByteArrayOutputStream bos = null; 
121.            ObjectOutputStream os = null; 
122.            try { 
123.                bos = new ByteArrayOutputStream(); 
124.                os = new ObjectOutputStream(bos); 
125.                for(User user : value){ 
126.                    os.writeObject(user); 
127.                } 
128.                os.writeObject(null); 
129.                os.close(); 
130.                bos.close(); 
131.                rv = bos.toByteArray(); 
132.            } catch (IOException e) { 
133.                throw new IllegalArgumentException("Non-serializable object", e); 
134.            } finally { 
135.                close(os); 
136.                close(bos); 
137.            } 
138.            return rv; 
139.        } 
140. 
141.        public static List<User> deserialize(byte[] in) { 
142.            List<User> list = new ArrayList<User>(); 
143.            ByteArrayInputStream bis = null; 
144.            ObjectInputStream is = null; 
145.            try { 
146.                if(in != null) { 
147.                    bis=new ByteArrayInputStream(in); 
148.                    is=new ObjectInputStream(bis); 
149.                    while (true) { 
150.                        User user = (User) is.readObject(); 
151.                        if(user == null){ 
152.                            break; 
153.                        }else{ 
154.                            list.add(user); 
155.                        } 
156.                    } 
157.                    is.close(); 
158.                    bis.close(); 
159.                } 
160.            } catch (IOException e) { 
161.                logger.warn("Caught IOException decoding %d bytes of data", 
162.                        in == null ? 0 : in.length, e); 
163.            } catch (ClassNotFoundException e) { 
164.                logger.warn("Caught CNFE decoding %d bytes of data", 
165.                        in == null ? 0 : in.length, e); 
166.            } finally { 
167.                CloseUtil.close(is); 
168.                CloseUtil.close(bis); 
169.            } 
170.            return list; 
171.        } 
172.    } 
173.     
174.    static class ListTranscoder{ 
175.        public static byte[] serialize(Object value) { 
176.            if (value == null) { 
177.                throw new NullPointerException("Can't serialize null"); 
178.            } 
179.            byte[] rv=null; 
180.            ByteArrayOutputStream bos = null; 
181.            ObjectOutputStream os = null; 
182.            try { 
183.                bos = new ByteArrayOutputStream(); 
184.                os = new ObjectOutputStream(bos); 
185.                os.writeObject(value); 
186.                os.close(); 
187.                bos.close(); 
188.                rv = bos.toByteArray(); 
189.            } catch (IOException e) { 
190.                throw new IllegalArgumentException("Non-serializable object", e); 
191.            } finally { 
192.                close(os); 
193.                close(bos); 
194.            } 
195.            return rv; 
196.        } 
197. 
198.        public static Object deserialize(byte[] in) { 
199.            Object rv=null; 
200.            ByteArrayInputStream bis = null; 
201.            ObjectInputStream is = null; 
202.            try { 
203.                if(in != null) { 
204.                    bis=new ByteArrayInputStream(in); 
205.                    is=new ObjectInputStream(bis); 
206.                    rv=is.readObject(); 
207.                    is.close(); 
208.                    bis.close(); 
209.                } 
210.            } catch (IOException e) { 
211.                logger.warn("Caught IOException decoding %d bytes of data", 
212.                        in == null ? 0 : in.length, e); 
213.            } catch (ClassNotFoundException e) { 
214.                logger.warn("Caught CNFE decoding %d bytes of data", 
215.                        in == null ? 0 : in.length, e); 
216.            } finally { 
217.                CloseUtil.close(is); 
218.                CloseUtil.close(bis); 
219.            } 
220.            return rv; 
221.        } 
222.    } 
223.} 



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







分享到:

上一篇:Redis VS Memcached
下一篇:NoSQL知识清单
.
分享到:
评论

相关推荐

    redis存储List集合

    标题中的“redis存储List集合”指的是使用Redis数据库来存储列表数据结构。Redis是一个开源的、高性能的键值存储系统,支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等。在这个示例中,重点是利用Redis...

    3.Redis数据类型之List类型

    Redis 中的 List 类型是一种链表结构,主要功能是 push、pop、获取一个范围的所有值等等。List 类型的操作中,key 理解为链表的名字。Redis 的 List 类型其实就是一个每个子元素都是 string 类型的双向链表。 List ...

    JOhm 是一个 Java 的对象哈希映射库,用于在 Redis 中存储对象.zip

    JOhm 是一个 Java 的对象哈希映射库,用于在 Redis 中存储对象约翰JOhm 是一个速度超快的 Java 对象哈希映射库,其灵感来自超棒的Ohm。JOhm OHM 是 Hibernate 等旧 ORM 的现代化身,不同之处在于我们这里处理的不是 ...

    redis 增删(obj,list)

    在本项目中,我们关注的是Redis如何处理对象(obj)和列表(list)的增删操作,以及如何结合Spring框架进行集成使用。下面我们将深入探讨这两个主题。 首先,让我们了解Redis中的对象存储。在Redis中,对象可以被...

    java操作redis

    - **内存存储与持久化**:虽然 Redis 主要在内存中运行以确保高性能,但它也提供了多种持久化策略,如 RDB 快照和 AOF(Append Only File)日志,以防止数据丢失。 - **主从同步**:支持主从架构,可以进行数据同步...

    redis字节码存压缩对象

    这些工具可能包括序列化/反序列化方法,用于将Java对象转换为适合Redis存储的字节码格式,以及压缩和解压缩方法。 - 这样的工具类能够帮助开发者更高效地与 Redis 交互,提高代码的可读性和可维护性,同时降低出错...

    使用.Net 技术操作Redis缓存技术,对Redis缓存进行存储增删改查等相关操作

    1. **存储数据**:Redis支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。例如,存储一个字符串键值对: ```csharp var db = redis.GetDatabase(); db...

    c#操作Redis的5种基本类型汇总

    接下来是Hash类型,它允许我们将多个键值对存储在同一个Redis键中,适合存储具有多个字段的对象。使用Hash类型可以更细粒度地管理数据,避免了数据的冗余存储。例如,使用以下代码来操作Hash类型数据: ```csharp ...

    Redis启动,数据结构存储系统

    - **哈希(Hash)**:键值对的集合,适合存储对象。每个键对应一个字段,值是另一个键值对。 - **列表(List)**:双向链表结构,支持LPOP、RPOP、LPUSH、RPUSH等操作,常用于实现消息队列。 - **集合(Set)**:...

    Redis实战_Redis实战中文完整版_Redis快速入门_Redis数据类型及操作_Redis常用

    - **哈希(Hash)**:用于存储键值对集合,适用于存储对象。 - **列表(List)**:有序的元素集合,支持两端插入和弹出元素。 - **集合(Set)**:无序的不重复元素集合,支持成员的添加、删除、检查等操作。 - **有序...

    WPF操作Redis简单实例

    2. **Redis数据类型操作**:C#中可以操作Redis的多种数据类型,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。例如,使用`StringSet`和`StringGet`方法操作字符串,`...

    ServiceStack.Redis 3.9

    6. **序列化**:库内置了对多种序列化器的支持,包括Json.NET、protobuf等,这使得在Redis中存储和检索对象变得容易。 7. **高级功能**:如脚本(Lua Scripting)支持,可以执行预编译的Lua脚本来提高性能,以及...

    redis的实战教学.pdf

    散列(Hash):键值对集合,适合存储对象。每个散列可以存储多个字段和值之间的映射。 集合(Set):无序集合,用于存储多个不重复的字符串元素,支持集合间的交集、并集和差集等操作。 有序集合(Sorted Set):与...

    redis存储数据.rar

    本篇文章将深入探讨如何通过Java代码在Redis缓存数据库中存储和检索数据,以及项目配置中需注意的关键点。 首先,为了在Java项目中使用Redis,我们需要在项目配置文件(如`application.properties`或`application....

    redis中文使用手册

    #### 三、Redis存储结构与存储格式 Redis采用了全量数据文件和增量请求日志两种文件格式来实现数据的持久化: 1. **全量数据文件**:这是一种保存内存中所有数据的文件格式,用于重启时快速加载数据。 2. **增量...

    Redis 命令参考手册中文完整版chm

    以上只是Redis命令参考手册中的一部分内容,完整的CHM文档包含了更详尽的命令介绍、参数解析和使用示例,对于深入理解和使用Redis有着极大的帮助。无论你是初学者还是经验丰富的开发者,这份中文版的Redis命令参考...

    redis的list,set,hash,sorted set,skiplist 1

    哈希表是一种键值对的存储结构,特别适合存储对象。每个键对应一个字段,值为该字段的值。Redis 提供了 `HSET` 用于设置键值对,`HGET` 获取单个值,`HGETALL` 获取所有键值对,`HDEL` 删除指定字段,以及 `HINCRBY...

    redis学习笔记Redis.md

    - **键值存储**: Redis 是一种键值存储类型的 NoSQL 数据库,提供高性能的键值存储服务。 - **支持的数据类型**: - `String`: 普通的字符串类型。 - `Hash`: 类似 Map 的结构,适合存储对象。 - `List`: 类似链表...

    redis数据类型指令整理

    字符串是Redis中最基本的数据类型,它能够存储任何形式的字符串,包括二进制数据、数字甚至是图片。 - set命令可以用于字符串设置,setnx命令用于只有当key不存在时才设置。 - get命令用于获取key对应的值。 - mset...

    C# Winfrom的Redis使用Demo

    在本文中,我们将深入探讨如何在C# Winform应用程序中集成和使用Redis,这是一个非常流行的内存数据存储系统,常用于缓存和高速数据处理。这个"C# Winfrom的Redis使用Demo"提供了基本的操作示例,非常适合初学者学习...

Global site tag (gtag.js) - Google Analytics