通过上一篇对 Redis 的简单介绍,想必对 Redis 的认知有了一个整体的把握。接下来我们将会一一介绍 Redis 所支持的数据类型。

概览

Redis 并不是一个普通的键-值存储器,它实际上是一个数据结构服务器,支持多种类型的值。这就意味着,尽管在传统的键-值存储中,用字符串键关联字符串值,但在 Redis 中,该值就不仅限于简单的字符串,还可以为更多更复杂的数据结构。以下就是 Redis 所支持的所有数据类型,将会分开讲解。

  • 二进制安全字符串(Binary-safe strings)
  • 列表(Lists):根据插入的顺序排好序的字符串集合,基本上就是一个链表。
  • 集合(Sets):唯一,未排序的字符串集合。
  • 有序集合(Sorted Sets):类似于集合,但每个字符串元素和一个浮点数相关联,叫做分数(score)。这些字符串元素总是根据分数排序,因此,与集合不同,有序集合可以检索一系列的数据(比如:获取前 10 个元素或者最后 10 个元素)。
  • 散列(Hashes):是由与值相关联的字段组成的 Map,字段和值都是字符串。类似于 Ruby 和 Python 的散列。
  • 位阵列(Bit arrays),简单点就叫做位图(Bitmaps):可以使用特殊命令像位阵列一样处理字符串值:你可以设置和清除单个,对所有位为 1 的位进行计数,找到第一个设置或未设置的位,以此类推。
  • HyperLogLogs:这是一个概率数据结构,可以被用于估计一个集合的基数。别怕,它比想象中的要简单,后面会详细讲解。
  • 流(Streams):一个只可追加的集合(类似 Map Entries),并提供了抽象日志数据类型。后面将会重新开一篇文章进行深入的讲解。

想要掌握这么多数据类型非常不容易的,比如这些数据类型到底是如何工作的,以及使用什么命令来解决特定的问题。所以,这篇文章仅仅是为了快速了解 Redis 的数据类型和最常用的模式。

对于接下来的所有例子,我都会使用 redis-cli 这个工具(简单且小巧的命令行工具),向 Redis 服务器发送命令。

Redis 键(Keys)

Redis 键是二进制安全的,也就是说你可以用任何二进制序列作为,从“foo”之类的字符串到 JPEG 文件的内容。空字符串也是一个有效的

有关的一些规则:

  • 太长的通常不是一个好的设计。比如一个长度位 1024 字节的不仅对内存不友好,而且在数据集中查询的时候,会消耗更多耗时的键比对的次数。当我们有一个测试大值是否存在的需求,建议将其哈希(Hash)(比如使用 SHA1),尤其是从内存和带宽的角度考虑。

  • 太短的同样也不是一个好的设计。比如用 “user:1000:followers” 替代 “u1000flw”,很明显前者更易读,并且增加的空间相比本身和对应的值是微不足道的。很显然,短会减少内存的消耗,但你需要的是找到一个正确的平衡。

  • 尝试坚持一定的原则。例如:“object-type:id” 是一个非常好的设计,如:“user:1000”。小数点儿和破折号常用于多字字段,如:“comment:1234:reply.to” 或者 “comment:1234:reply-to

  • 最大允许的的大小:512MB