redis数据类型
问题
为了在特殊的应用场景中更好的运用redis,理解redis的数据类型是必不可少的一环。
解决方案
不同于其他多数NoSQL的key-value式的存储引擎解决方案,redis包含了几种内置的数据类型,这使得开发者能够以一种更有意义的方式来构建自己的数据。预定义数据类型的好处是:特定数据类型的操作能够得以在redis内部完成,我们下面会提到redis支持的数据类型。
问题讨论
不同于其他多数NoSQL的key-value式的存储引擎解决方案,redis包含了几种内置的数据类型,这使得开发者能够以一种更有意义的方式来构建自己的数据。预定义数据类型的好处是:特定数据类型的操作能够得以在redis内部完成——这种方式比在外部处理快得多,我们下面会提到redis支持的数据类型。
我们在研究这些特殊的数据类型之前,在设计保存数据的键值结构的时候必须牢记的几点
一、命名空间的一致性
由于key能包含任何的字符,根据你的业务逻辑,你可以用分隔符来分隔你的命名空间,比如:cache:project:319:tasks,这里就是用的分号作为分隔符。
二、合理定义key的大小
对key进行检索需要做一些比较操作,因此让key竟可能的小能够提高性能,更小的key也能更有效的利用内存。
三、
就算key不应该设得特别的大,但是特别小的key也不会带来多大的性能提升,因此在设计key的时候应该综合考虑易读性和合理key大小来设计。这对你以及对redis来说都是个不错的主意。
基于上面几点,像c:p:319:t或者user 123这样的key是不合理的,首先你根本看不明白这其中的业务含义,而且后者还带有空格,另外,像cache:project:319:tasks,lastchatmessage,或者45SDFDF123KLJ123JL324JLK5LKJ3214JLL45C这样的就很好,因为他们都有特殊的含义,主意最后一个是SHA1 hash,你很难猜测它的具体含义,但是如果你存储的是一个你总能计算出它的hash值的对象,这样做是非常有用的。
字符串类型
字符串类型是redis中最简单的一种数据类型。在其他key-value存储引擎中,字符串也是一种典型的数据类型,你能存储各种各样的字符串包括二进制数据,比如:在社交网络中你想缓存头像这样的图片数据。你唯一需要记住的是:redis内部不能存储超过512MB的键值数据。
链表类型
redis中的链表是已经排好序的二进制字符串链表,依据双向链表的数据结构来实现,这意味着通过索引的方式来获取链表元素会非常慢,单双休从链表的头或者尾部追加数据是非常快的,因此在数据库中适度运用,你可能会想到的是用链表来实现诸如队列这样的数据结构,后面我们会提到这种方式。
hash类型
Much like traditional hashtables, hashes in Redis store several fields and their values
inside a specific key. Hashes are a perfect option to map complex objects inside Redis,
by using fields for object attributes (example fields for a car object might be “color”,
“brand”, “license plate”).
集合与排序集合类型
redis的集合是一个无序的二进制字符串集合。在一个给定的集合中元素是不能重复的。比如:如果你往同一个集合中两次添加同一元素,redis会忽略掉你的第二次操作。他允许执行像交并等这样的传统的集合操作。
这看上去感觉很像链表,但是他们的实现方式是不一样的,出于他们的差异使得他们能用于不同的需求。内存利用效率应该比链表要高。
排序集合是集合的一个特殊实现,他是通过一个非二进制字符的score来定义的(此次翻译过于牵强),这个score使得你可以通过ZRANGE命令行工具来检索一个已经排好序的元素列表。后面我们会提到一些集合和排序集合的应用案例。
阅读(683) | 评论(0) | 转发(0) |