数据类型
#
字符串字符串是 KeyDB 最基本的值类型。KeyDB 字符串是二进制安全的,这意味着 KeyDB 字符串可以包含任何类型的数据,例如 JPEG 图像或序列化的 Ruby 对象。
一个字符串值的最大长度可以是 512 MB。
在 KeyDB 中,你可以使用字符串做很多有趣的事情,例如你可以:
- 使用 INCR 家族中的命令将字符串用作原子计数器:INCR、DECR、INCRBY。
- 使用 APPEND 命令向字符串追加内容。
- 使用 GETRANGE 和 SETRANGE 将字符串用作随机访问向量。
- 使用 GETBIT 和 SETBIT 在很小的空间内编码大量数据,或创建一个由 KeyDB 支持的布隆过滤器。
更多信息请阅读KeyDB 数据类型简介。
#
列表KeyDB 列表是简单的字符串列表,按插入顺序排序。可以向 KeyDB 列表的头部(左侧)或尾部(右侧)推入新元素来添加元素。
LPUSH 命令在头部插入一个新元素,而 RPUSH 在尾部插入一个新元素。当对一个空键执行这些操作之一时,会创建一个新列表。类似地,如果列表操作清空了列表,该键将从键空间中移除。这些是非常方便的语义,因为如果用一个不存在的键作为参数调用所有列表命令,它们的行为将完全像是对一个空列表进行操作。
一些列表操作及结果列表的示例:
一个列表的最大长度是 2^32 - 1 个元素(4294967295,每个列表超过 40 亿个元素)。
从时间复杂度的角度来看,KeyDB 列表的主要特点是支持在列表头部和尾部附近以常量时间插入和删除元素,即使列表中有数百万个项目也是如此。在列表两端访问元素非常快,但如果你试图访问一个非常大列表的中间部分,速度会很慢,因为这是一个 O(N) 操作。
你可以用 KeyDB 列表做很多有趣的事情,例如你可以:
- 在社交网络中为时间线建模,使用 LPUSH 将新元素添加到用户时间线,并使用 LRANGE 检索最近插入的一些项目。
- 你可以将 LPUSH 与 LTRIM 一起使用,创建一个永不超过给定元素数量的列表,只保留最新的 N 个元素。
- 列表可以用作消息传递原语,例如可以参考著名的 Resque Ruby 库来创建后台任务。
- 你还可以用列表做更多的事情,此数据类型支持许多命令,包括像 BLPOP 这样的阻塞命令。
更多信息请阅读KeyDB 数据类型简介。
#
集合KeyDB 集合是无序的字符串集合。可以在 O(1) 时间(无论集合内包含多少元素,都是常量时间)内添加、删除和测试成员是否存在。
KeyDB 集合有一个很好的特性,即不允许重复的成员。多次添加同一个元素只会导致集合中保留该元素的一个副本。实际上,这意味着添加一个成员不需要“先检查是否存在再添加”的操作。
KeyDB 集合一个非常有趣的特点是,它们支持许多服务器端命令,可以从现有集合计算出新的集合,因此你可以在很短的时间内对集合进行并集、交集、差集运算。
一个集合中的最大成员数是 2^32 - 1(4294967295,每个集合超过 40 亿个成员)。
你可以使用 KeyDB 集合做很多有趣的事情,例如你可以:
- 你可以使用 KeyDB 集合来跟踪唯一的项目。想知道访问某篇博文的所有独立 IP 地址吗?只需在每次处理页面浏览时使用 SADD。你可以确信重复的 IP 不会被插入。
- KeyDB 集合很适合表示关系。你可以使用 KeyDB 创建一个标签系统,用一个集合来表示每个标签。然后,你可以使用 SADD 命令,将所有具有特定标签的对象的 ID 添加到代表该标签的集合中。想获取同时具有三个不同标签的所有对象的 ID 吗?只需使用 SINTER。
- 你可以使用 SPOP 或 SRANDMEMBER 命令从集合中随机提取元素。
和往常一样,更多信息请阅读KeyDB 数据类型简介。
#
哈希KeyDB 哈希是字符串字段和字符串值之间的映射,因此它们是表示对象的完美数据类型(例如,一个具有姓名、姓氏、年龄等多个字段的用户)。
一个字段较少的哈希(“较少”意味着大约一百个左右)的存储方式占用空间非常小,因此你可以在一个小型 KeyDB 实例中存储数百万个对象。
虽然哈希主要用于表示对象,但它们能够存储许多元素,所以你也可以将哈希用于许多其他任务。
每个哈希最多可以存储 2^32 - 1 个字段-值对(超过 40 亿)。
更多信息请阅读KeyDB 数据类型简介。
#
有序集合KeyDB 有序集合与 KeyDB 集合类似,也是不重复的字符串集合。不同之处在于,有序集合的每个成员都与一个分数相关联,该分数用于按从小到大的顺序排列集合。虽然成员是唯一的,但分数可以重复。
使用有序集合,你可以非常快速地添加、删除或更新元素(时间与元素数量的对数成正比)。由于元素是“按序获取”而不是事后排序,你还可以非常快速地按分数或排名(位置)获取范围。访问有序集合的中间部分也非常快,所以你可以将有序集合用作一个智能的非重复元素列表,可以快速访问你需要的一切:有序的元素、快速的存在性测试、快速访问中间的元素!
简而言之,使用有序集合,你可以用极高的性能完成许多在其他类型数据库中很难建模的任务。
使用有序集合,你可以:
- 在一个大型在线游戏中制作排行榜,每次有新分数提交时,你都使用 ZADD 来更新它。你可以使用 ZRANGE 轻松获取排名靠前的用户,也可以在给定用户名的情况下,使用 ZRANK 返回其在列表中的排名。将 ZRANK 和 ZRANGE 结合使用,你可以显示与给定用户分数相似的用户。所有这些都非常“快”。
- 有序集合常用于索引存储在 KeyDB 内部的数据。例如,如果你有许多代表用户的哈希,你可以使用一个有序集合,其中的元素以用户年龄为分数,用户 ID 为值。因此,使用 ZRANGEBYSCORE 可以轻松快捷地检索所有在特定年龄区间的用户。
有序集合可能是最先进的 KeyDB 数据类型,所以请花些时间查看完整的有序集合命令列表,以发现你可以用 KeyDB 做些什么!此外,你可能还想阅读KeyDB 数据类型简介。
#
位图和 HyperLogLogsKeyDB 还支持位图和 HyperLogLogs,它们实际上是基于字符串基本类型的数据类型,但有自己的语义。
有关这些类型的信息,请参阅命令部分中的 KeyDB 数据类型简介。