*数据类型

*字符串

字符串是 Redis 中最基本的值类型。Redis 字符串是二进制安全的,这意味着 Redis 字符串可以包含任何类型的数据,例如 JPEG 图像或序列化的 Ruby 对象。

字符串值的最大长度为 512 兆字节。

你可以在 Redis 中使用字符串做很多有趣的事情,例如:

  • 使用 INCR 系列命令将字符串用作原子计数器:INCRDECRINCRBY
  • 使用 APPEND 命令追加到字符串。
  • 使用 GETRANGESETRANGE 将字符串用作随机访问向量。
  • 使用 GETBITSETBIT 在小空间中编码大量数据,或创建 Redis 支持的布隆过滤器。

查看所有 可用的字符串命令 获取更多信息,或阅读 Redis 数据类型介绍

*列表

Redis 列表只是字符串列表,按插入顺序排序。可以将元素添加到 Redis 列表的头部(左侧)或尾部(右侧)。

LPUSH 命令在头部插入新元素,而 RPUSH 在尾部插入新元素。对空键执行这些操作之一时会创建新列表。类似地,如果列表操作将清空列表,则该键会从键空间中移除。这些语义非常方便,因为所有列表命令在接收到不存在的键作为参数时,其行为就像被空列表调用一样。

一些列表操作示例及结果列表:

LPUSH mylist a   # 现在列表是 "a"
LPUSH mylist b   # 现在列表是 "b","a"
RPUSH mylist c   # 现在列表是 "b","a","c" (这次使用了 RPUSH)

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

从时间复杂度的角度来看,Redis 列表的主要特性支持在头部和尾部附近以常数时间插入和删除元素,即使已插入数百万项。访问列表两端附近的元素非常快,但如果你尝试访问非常大列表的中间位置,则会很慢,因为这是 O(N) 操作。

你可以使用 Redis 列表做很多有趣的事情,例如:

  • 在社交网络中建模时间线,使用 LPUSH 在用户时间线中添加新元素,并使用 LRANGE 检索最近插入的一些项目。
  • 你可以将 LPUSHLTRIM 一起使用,创建一个永远不会超过给定元素数量、只记住最新 N 个元素的列表。
  • 列表可以用作消息传递原语,例如著名的 Resque Ruby 库用于创建后台作业。
  • 你可以用列表做很多事情,这种数据类型支持许多命令,包括阻塞命令如 BLPOP

请查看所有 操作列表的可用命令 获取更多信息,或阅读 Redis 数据类型介绍

*集合

Redis 集合是字符串的无序集合。可以在 O(1) 时间内添加、删除和测试成员是否存在(无论集合中包含多少元素,都是常数时间)。

Redis 集合具有不允许重复成员的理想特性。多次添加相同元素将导致集合中只保留该元素的一个副本。实际上这意味着添加成员不需要 检查是否存在然后添加 的操作。

关于 Redis 集合的一个非常有趣的事情是,它们支持许多服务器端命令来计算从现有集合开始的集合,因此你可以在短时间内进行并集、交集和差集运算。

集合中的最大成员数为 232 - 1(4294967295,每个集合超过 40 亿个成员)。

你可以使用 Redis 集合做很多有趣的事情,例如:

  • 你可以使用 Redis 集合跟踪唯一的事物。想知道访问给定博客文章的所有唯一 IP 地址吗?只需在处理页面浏览时使用 SADD。你可以确保重复的 IP 不会被插入。
  • Redis 集合非常适合表示关系。你可以使用 Redis 创建标签系统,使用集合表示每个标签。然后你可以使用 SADD 命令将所有具有给定标签的对象的 ID 添加到表示该特定标签的集合中。你想要同时具有三个不同标签的所有对象的 ID 吗?只需使用 SINTER
  • 你可以使用集合通过 SPOPSRANDMEMBER 命令随机提取元素。

像往常一样,查看 集合命令的完整列表 获取更多信息,或阅读 Redis 数据类型介绍

*哈希

Redis 哈希是字符串字段和字符串值之间的映射,因此它们是表示对象的完美数据类型(例如,一个具有多个字段的用户,如姓名、姓氏、年龄等):

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

具有少量字段(少量意味着大约一百个左右)的哈希以一种非常节省空间的方式存储,因此你可以在一个小型 Redis 实例中存储数百万个对象。

虽然哈希主要用于表示对象,但它们能够存储许多元素,因此你也可以将哈希用于许多其他任务。

每个哈希最多可以存储 232 - 1 个字段-值对(超过 40 亿)。

查看 哈希命令的完整列表 获取更多信息,或阅读 Redis 数据类型介绍

*有序集合

Redis 有序集合类似于 Redis 集合,是不重复的字符串集合。区别在于有序集合的每个成员都与一个分数相关联,用于将有序集合按分数从小到大排序。虽然成员是唯一的,但分数可以重复。

使用有序集合,你可以非常快速地添加、删除或更新元素(时间与元素数量的对数成正比)。由于元素是 按顺序获取 而不是事后排序,你还可以通过分数或排名(位置)非常快速地获取范围。访问有序集合的中间位置也非常快,因此你可以将有序集合用作智能的非重复元素列表,在其中可以快速访问所需的一切:有序的元素、快速的存在性测试、快速访问中间位置的元素!

简而言之,使用有序集合你可以以出色的性能完成许多任务,而在其他类型的数据库中建模这些任务真的很难。

使用有序集合,你可以:

  • 在大型在线游戏中制作排行榜,每次提交新分数时都使用 ZADD 更新它。你可以轻松使用 ZRANGE 获取排名靠前的用户,也可以给定用户名,使用 ZRANK 返回其在列表中的排名。一起使用 ZRANK 和 ZRANGE 可以显示分数与给定用户相似的用户。所有这些都 非常快
  • 有序集合通常用于索引存储在 Redis 内部的数据。例如,如果你有许多表示用户的哈希,你可以使用有序集合,将用户的年龄作为分数,用户 ID 作为值。因此使用 ZRANGEBYSCORE trivial 且快速地检索给定年龄范围内的所有用户。

有序集合可能是 Redis 最先进的数据类型,所以花点时间查看 有序集合命令的完整列表,发现 Redis 能做什么!你也可以阅读 Redis 数据类型介绍

*位图和 HyperLogLog

Redis 还支持位图和 HyperLogLog,它们实际上是基于字符串基本类型的数据类型,但具有自己的语义。

请参阅 Redis 数据类型介绍 了解有关这些类型的信息。