离线下载
PDF版 ePub版

powersoft · 更新于 2017-09-20 17:00:34

数据类型初探

字符串 (Strings)

字符串是 Redis 最基本的数据类型。Redis 字符串是二进制安全的,也就是说,一个 Redis 字符串可以包含任意类型的数据,例如一张 JPEG 图像,或者一个序列化的 Ruby 对象。

一个字符串最大为 512M 字节。

你可以使用 Redis 的字符串类型做很多有意思的事情,例如,你可以:

  • 使用 INCR 命令族 (INCR,DECR,INCRBY),将字符串作为原子计数器。
  • 使用 APPEND 命令追加字符串。
  • 使用 GETRANGE 和 SETRANGE 命令,使字符串作为随机访问向量 (vectors)。
  • 编码大量数据到很小的空间,或者使用 GETBIT 和 SETBIT 命令,创建一个基于 Redis 的布隆 (Bloom) 过滤器。

后续我们会详细介绍可用的字符串命令,也会详细介绍 Redis 数据类型的更多高级信息。

列表 (Lists)

Redis 列表仅仅是按照插入顺序排序的字符串列表。可以添加一个元素到 Redis 列表的头部 (左边) 或者尾部 (右边)。

LPUSH 命令用于插入一个元素到列表的头部,RPUSH 命令用于插入一个元素到列表的尾部。当这两个命令操作在一个不存在的键时,将会创建一个新的列表。同样,如果一个操作会清空列表,那么该键将会从键空间 (key space) 移除。这些是非常方便的语义,因为列表命令如果使用不存在的键作为参数,就会表现得像命令运行在一个空列表上一样。

一些列表操作的例子结果:

LPUSH mylist a   # now the list is “a”  
LPUSH mylist b   # now the list is “b”, ”a”  
RPUSH mylist c   # now the list is “b”,”a”, ”c”(RPUSH was used this time)  

列表的最大长度是 223-1 个元素 (4294967295,超过 40 亿个元素)。

从时间复杂度的角度看,Redis 列表主要的特性是支持以常量时间在列表的头和尾附近插入和删除元素,即使列表中已经插入了上百万的数据。访问列表两端的元素非常的快速,但是访问一个非常大的列表的中间却非常的慢,因为这是一个 O(N)时间复杂度的操作。

你可以使用 Redis 的列表类型做很多有意思的事情,例如,你可以:

  • 为社交网络时间轴 (timeline) 建模,使用 LPUSH 命令往用户时间轴插入元素,使用 LRANGE 命令获得最近事项。
  • 使用 LPUSH 和 LTRIM 命令创建一个不会超出给定数量元素的列表,只存储最近的 N 个元素。
  • 列表可以用作消息传递原语,例如,众所周知的用于创建后台任务的 Ruby 库 Resque。
  • 你可以用列表做更多的事情,这种数据类型支持很多的命令,包括阻塞命令,如 BLPOP。

后续我们会详细介绍可用的列表命令,也会详细介绍 Redis 数据类型的更多高级信息。

集合 (Sets)

Redis 集合是没有顺序的字符串集合 (collection)。可以在 O(1) 的时间复杂度添加、删除和测试元素存在与否 (不管集合中有多少元素都是常量时间)。

Redis 集合具有你需要的不允许重复成员的性质。多次加入同一个元素到集合也只会有一个拷贝在其中。实际上,这意味着加入一个元素到集合中并不需要检查元素是否已存在。

Redis 集合非常有意思的是,支持很多服务器端的命令,可以在很短的时间内和已经存在的集合一起计算并集,交集和差集。

你可以使用 Redis 的集合类型做很多有意思的事情,例如,你可以:

  • 你可以使用 Redis 集合追踪唯一性的事情。你想知道访问某篇博客文章的所有唯一 IP 吗?只要 每次页面访问时使用 SADD 命令就可以了。你可以放心,重复的 IP 是不会被插入进来的。
  • Redis 集合可以表示关系。你可以通过使用集合来表示每个标签,来创建一个标签系统。然后你可以把所有拥有此标签的对象的 ID 通过 SADD 命令,加入到表示这个标签的集合中。你想获得同时拥有三个不同标签的对象的全部 ID 吗?用 SINTER 就可以了。
  • 你可以使用 SPOP 或 SRANDMEMBER 命令来从集合中随机抽取元素。

后续我们会详细介绍可用的集合命令,也会详细介绍 Redis 数据类型的更多高级信息。

哈希 / 散列 (Hashes)

Redis 哈希是字符串字段 (field) 与字符串值之间的映射,所以是表示对象的理想数据类型 (例如:一个用户对象有多个字段,像用户名,姓氏,年龄等等):

@cli  
HMSET user:1000 username antirez password P1pp0 age 34  
HGETALL user:1000  
HSET user:1000 password 12345  
HGETALL user:1000  

拥有少量字段 (少量指的是大约 100) 的哈希会以占用很少存储空间的方式存储,所以你可以在一个很小的 Redis 实例里存储数百万的对象。

由于哈希主要用来表示对象,对象能存储很多元素,所以你可以用哈希来做很多其他的事情。

每个哈希可以存储多达 223-1 个字段值对 (field-value pair)(多于 40 亿个)。

后续我们会详细介绍可用的哈希命令,也会详细介绍 Redis 数据类型的更多高级信息。

有序集合 (Sorted sets)

Redis 有序集合和 Redis 集合类似,是非重复字符串集合 (collection)。不同的是,每一个有序集合的成员都有一个关联的分数 (score),用于按照分数高低排序。尽管成员是唯一的,但是分数是可以重复的。

对有序集合我们可以通过很快速的方式添加,删除和更新元素 (在和元素数量的对数成正比的时间内)。由于元素是有序的而无需事后排序,你可以通过分数或者排名 (位置) 很快地来获取一个范围内的元素。访问有序集合的中间元素也是很快的,所以你可以使用有序集合作为一个无重复元素,快速访问你想要的一切的聪明列表:有序的元素,快速的存在性测试,快速的访问中间元素!

总之,有序集合可以在很好的性能下,做很多别的数据库无法模拟的事情。

使用有序集合你可以:

例如多人在线游戏排行榜,每次提交一个新的分数,你就使用 ZADD 命令更新。你可以很容易地使用 ZRANGE 命令获取前几名用户,你也可以用 ZRANK 命令,通过给定用户名返回其排行。同时使用 ZRANK 和 ZRANGE 命令可以展示与给定用户相似的用户及其分数。以上这些操作都非常的快。

有序集合常用来索引存储在 Redis 内的数据。例如,假设你有很多表示用户的哈希,你可以使用有序集合,用年龄作为元素的分数,用用户 ID 作为元素值,于是你就可以使用 ZRANGEBYSCORE 命令很快且轻而易举地检索出给定年龄区间的所有用户了。

有序集合或许是最高级的 Redis 数据类型,后续我们会详细介绍可用的有序集合命令,也会详细介绍 Redis 数据类型的更多高级信息。

位图 (Bitmaps) 和超重对数 (HyperLogLogs)

Redis 还支持位图和超重对数这两种基于字符串基本类型,但有自己语义的数据类型。

后续我们会详细介绍这些数据类型的更多高级信息。