redis常见数据类型

fxz大约 22 分钟redis缓存

redis常见数据类型

streams(流)

Redis 流是一种数据结构,其作用类似于仅追加日志,但也实现了多种操作来克服典型仅追加日志的一些限制。其中包括 O(1) 时间内的随机访问和复杂的消费策略,例如消费者组。

使用场景:

  • 事件溯源(例如,跟踪用户操作、点击等)
  • 传感器监控(例如,现场设备的读数)
  • 通知(例如,将每个用户的通知记录存储在单独的流中)
  • 消息队列

Redis 为每个流条目生成一个唯一的 ID。可以使用这些 ID 稍后检索其关联条目或读取并处理流中的所有后续条目。

常用命令

完整命令open in new window

向race:france添加一条数据,*表示id自动生成,后面是对象的属性和属性值。

 XADD race:france * rider Castilla speed 29.9 position 1 location_id 2

命令返回的条目 ID 明确地标识给定流中的每个条目,由两部分组成:

<millisecondsTime>-<sequenceNumber>

毫秒时间部分实际上是生成流ID的本地Redis节点中的本地时间,但是如果当前毫秒时间恰好小于前一个条目时间,则使用前一个条目时间,因此如果时钟向后跳单调递增的 ID 属性仍然成立。序列号用于在同一毫秒内创建的条目。由于序列号是64位宽,因此实际上同一毫秒内可以生成的条目数量没有限制。

消费者组

消费者组就像一个伪消费者,从流中获取数据,实际上为多个消费者提供服务,提供一定的保证:

  1. 每条消息都提供给不同的消费者,因此同一条消息不可能传递给多个消费者。
  2. 消费者在消费者组中通过名称来标识,该名称是实现消费者的客户端必须选择的区分大小写的字符串。这意味着即使在断开连接后,流消费者组仍保留所有状态,因为客户端将再次声明自己是同一个消费者。然而,这也意味着客户端需要提供唯一的标识符。
  3. 每个消费者组都有第一个从未消费过的 ID的概念,这样,当消费者请求新消息时,它可以只提供之前未传递的消息。
  4. 使用消息需要使用特定命令进行ack显式确认。Redis 将确认解释为:此消息已正确处理,因此可以将其从消费者组中逐出。
  5. 消费者组跟踪当前待处理的所有消息,即已传递给消费者组的某个消费者但尚未确认已处理的消息。由于此功能,当访问流的消息历史记录时,每个消费者只会看到传递给它的消息

在某种程度上,消费者组可以被想象成关于流的某种状态:

+----------------------------------------+
| consumer_group_name: mygroup           |
| consumer_group_stream: somekey         |
| last_delivered_id: 1292309234234-92    |
|                                        |
| consumers:                             |
|    "consumer-1" with pending messages  |
|       1292309234234-4                  |
|       1292309234232-8                  |
|    "consumer-42" with pending messages |
|       ... (and so forth)               |
+----------------------------------------+

如果您从这个角度来看这一点,就很容易理解消费者组可以做什么,它如何能够向消费者提供其待处理消息的历史记录,以及如何为请求新消息的消费者提供服务消息 ID 大于last_delivered_id.

现在是时候放大看看基本的消费者组命令了。它们是:

为流race:italy,创建一个消费者组叫italy_riders,$表示表示当前流中最大的id,即为消费者组中的消费者提供新的消息。MKSTREAM表示不存在则创建流。

XGROUP CREATE race:italy italy_riders $ MKSTREAM

使用XADD为流创建几条数据。

 XADD race:italy * rider Castilla
 XADD race:italy * rider Royce
 XADD race:italy * rider Sam-Bodden
 XADD race:italy * rider Prickett
 XADD race:italy * rider Norem

使用XREADGROUP命令,为italy_riders组中的Alice读取一条数据。

 XREADGROUP GROUP italy_riders Alice COUNT 1 STREAMS race:italy >
  • 如果 ID 是特殊 ID >,则该命令将仅返回迄今为止从未传递给其他消费者的新消息,并且作为副作用,将更新消费者组的最后一个 ID
  • 如果 ID 是任何其他有效的数字 ID,那么该命令将允许我们访问待处理消息的历史记录。也就是说,传递给此指定使用者(由提供的名称标识)且迄今为止从未通过 XACK确认的消息集。

可以看到xadd创建的数据。

可以看到消费者组的信息,其中italy_riders有一个消费者,有一条待处理消息。

XACK race:italy italy_riders 1710417175164-0

执行完XACK,待处理消息没了。

流 API 中的特殊 ID

有几个特殊的 ID 可以在 Redis API 中使用。

前两个特殊 ID 是-+,用于通过该XRANGEopen in new window命令进行范围查询。这两个 ID 分别表示可能的最小 ID(基本上是0-1)和可能的最大 ID(即18446744073709551615-18446744073709551615)。

然后还有我们想要说的 API,即流中 ID 最大的项目的 ID。这就是这个$意思。当我创建或设置消费者组的 ID 时,我可以将最后交付的项目设置为 ,$以便仅向该组中的消费者交付新条目。

$并不意味着+,它们是两个不同的东西,因为+是每个可能的流中可能的最大 ID,而$是包含给定条目的给定流中的最大 ID。

另一个特殊的ID是>,它是仅与消费者组相关且仅在使用XREADGROUPopen in new window该命令时具有特殊含义。这个特殊的 ID 意味着我们只需要迄今为止从未交付给其他消费者的条目。所以基本上该>ID是消费者组最后交付的ID 。

最后,特殊 ID*只能与命令一起使用XADDopen in new window,意味着为我们自动为新条目选择一个 ID。

所以我们有-+$>*,并且都有不同的含义,并且大多数时候,可以在不同的上下文中使用。

bitmaps(位图)

可以看成是一个01字符串。

使用场景:

  • 用户连续登录、签到。

常用命令

SETBITopen in new windowGETBITopen in new window均为 O(1)。 BITOPopen in new window是 O(n),其中n是比较中最长字符串的长度

bitfields(位域)

Redis 位域允许您设置、递增和获取任意位长度的整数值。

例如,您可以操作从无符号 1 位整数到有符号 63 位整数的任何值。

这些值使用二进制编码的 Redis 字符串存储。位域支持原子读、写和增量操作,使它们成为管理计数器和类似数值的不错选择。

基本命令

位图和位域的区别

位图适用于简单的位操作和状态标记,例如用户签到。而位域则更适用于需要对不同位段进行复杂操作的场景。

位图可以看成是一个01字符串,进行状态标识。

位域可以看成是一个整型数组,更多的是进行位运算。

hyperLogLog

在统计大规模数据集中的唯一元素数量时非常有用。

使用场景:

统计页面访问量、点赞数量。

常用命令

  1. PFADD:将一个或多个元素添加到 HyperLogLog 中。
  2. PFCOUNT :返回给定 HyperLogLog 的基数估算值(即不同元素的数量)。
  3. PFMERGE:将多个 HyperLogLog 合并为一个 HyperLogLog。

geospatial(地理空间)

使用场景:

附近的人

常用命令

string(字符串)

Redis 字符串存储字节序列,包括文本、序列化对象和二进制数组。因此,字符串是可以与 Redis 键关联的最简单的值类型。它们通常用于缓存,但它们支持附加功能,使您也可以实现计数器并执行按位运算。

使用场景:

缓存token、计数器、缓存一切。。。

常用命令

list (列表)

使用场景:

​ 最新发布的文章、生产者消费者模式、队列、栈。

常见命令

set

使用场景:

​ 网站 UV 统计(数据量巨大的场景还是 HyperLogLog更适合一些)、共同关注(交集)、可能认识的人(差集)

常见命令

hash

使用场景:

​ 缓存对象

常见命令

zset (排序集)

Redis 排序集是按关联分数排序的唯一字符串(成员)的集合。当多个字符串具有相同分数时,字符串按字典顺序排序。排序集的一些用例包括:

  • 排行榜。例如,您可以使用排序集轻松维护大型在线游戏中最高分数的有序列表。
  • 速率限制器。特别是,您可以使用排序集构建滑动窗口速率限制器,以防止过多的 API 请求。

常用命令

todo 底层数据结构