redis常见数据类型
redis常见数据类型
streams(流)
Redis 流是一种数据结构,其作用类似于仅追加日志,但也实现了多种操作来克服典型仅追加日志的一些限制。其中包括 O(1) 时间内的随机访问和复杂的消费策略,例如消费者组。
使用场景:
- 事件溯源(例如,跟踪用户操作、点击等)
- 传感器监控(例如,现场设备的读数)
- 通知(例如,将每个用户的通知记录存储在单独的流中)
- 消息队列
Redis 为每个流条目生成一个唯一的 ID。可以使用这些 ID 稍后检索其关联条目或读取并处理流中的所有后续条目。
常用命令
向race:france添加一条数据,*表示id自动生成,后面是对象的属性和属性值。
XADD race:france * rider Castilla speed 29.9 position 1 location_id 2
命令返回的条目 ID 明确地标识给定流中的每个条目,由两部分组成:
<millisecondsTime>-<sequenceNumber>
毫秒时间部分实际上是生成流ID的本地Redis节点中的本地时间,但是如果当前毫秒时间恰好小于前一个条目时间,则使用前一个条目时间,因此如果时钟向后跳单调递增的 ID 属性仍然成立。序列号用于在同一毫秒内创建的条目。由于序列号是64位宽,因此实际上同一毫秒内可以生成的条目数量没有限制。
消费者组
消费者组就像一个伪消费者,从流中获取数据,实际上为多个消费者提供服务,提供一定的保证:
- 每条消息都提供给不同的消费者,因此同一条消息不可能传递给多个消费者。
- 消费者在消费者组中通过名称来标识,该名称是实现消费者的客户端必须选择的区分大小写的字符串。这意味着即使在断开连接后,流消费者组仍保留所有状态,因为客户端将再次声明自己是同一个消费者。然而,这也意味着客户端需要提供唯一的标识符。
- 每个消费者组都有第一个从未消费过的 ID的概念,这样,当消费者请求新消息时,它可以只提供之前未传递的消息。
- 使用消息需要使用特定命令进行ack显式确认。Redis 将确认解释为:此消息已正确处理,因此可以将其从消费者组中逐出。
- 消费者组跟踪当前待处理的所有消息,即已传递给消费者组的某个消费者但尚未确认已处理的消息。由于此功能,当访问流的消息历史记录时,每个消费者只会看到传递给它的消息。
在某种程度上,消费者组可以被想象成关于流的某种状态:
+----------------------------------------+
| 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
.
现在是时候放大看看基本的消费者组命令了。它们是:
XGROUP
用于创建、销毁和管理消费者组。XREADGROUP
用于通过消费者组从流中读取数据。XACK
是允许消费者将待处理消息标记为已正确处理的命令。
为流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 是-
和+
,用于通过该XRANGE
命令进行范围查询。这两个 ID 分别表示可能的最小 ID(基本上是0-1
)和可能的最大 ID(即18446744073709551615-18446744073709551615
)。
然后还有我们想要说的 API,即流中 ID 最大的项目的 ID。这就是这个$
意思。当我创建或设置消费者组的 ID 时,我可以将最后交付的项目设置为 ,$
以便仅向该组中的消费者交付新条目。
$
并不意味着+
,它们是两个不同的东西,因为+
是每个可能的流中可能的最大 ID,而$
是包含给定条目的给定流中的最大 ID。
另一个特殊的ID是>
,它是仅与消费者组相关且仅在使用XREADGROUP
该命令时具有特殊含义。这个特殊的 ID 意味着我们只需要迄今为止从未交付给其他消费者的条目。所以基本上该>
ID是消费者组最后交付的ID 。
最后,特殊 ID*
只能与命令一起使用XADD
,意味着为我们自动为新条目选择一个 ID。
所以我们有-
、+
、$
、>
和*
,并且都有不同的含义,并且大多数时候,可以在不同的上下文中使用。
bitmaps(位图)
可以看成是一个01字符串。
使用场景:
- 用户连续登录、签到。
常用命令
SETBIT
将提供的偏移量处的一位设置为 0 或 1。GETBIT
返回给定偏移处的位值。BITOP
在不同字符串之间执行按位运算。提供的运算有 AND、OR、XOR 和 NOT。BITCOUNT
执行总体计数,报告设置为 1 的位数。BITPOS
查找具有指定值 0 或 1 的第一位。
SETBIT
且GETBIT
均为 O(1)。 BITOP
是 O(n),其中n是比较中最长字符串的长度
bitfields(位域)
Redis 位域允许您设置、递增和获取任意位长度的整数值。
例如,您可以操作从无符号 1 位整数到有符号 63 位整数的任何值。
这些值使用二进制编码的 Redis 字符串存储。位域支持原子读、写和增量操作,使它们成为管理计数器和类似数值的不错选择。
基本命令
BITFIELD
以原子方式设置、递增和读取一个或多个值。BITFIELD_RO
是 的只读变体BITFIELD
。
位图和位域的区别
位图适用于简单的位操作和状态标记,例如用户签到。而位域则更适用于需要对不同位段进行复杂操作的场景。
位图可以看成是一个01字符串,进行状态标识。
位域可以看成是一个整型数组,更多的是进行位运算。
hyperLogLog
在统计大规模数据集中的唯一元素数量时非常有用。
使用场景:
统计页面访问量、点赞数量。
常用命令
- PFADD:将一个或多个元素添加到 HyperLogLog 中。
- PFCOUNT :返回给定 HyperLogLog 的基数估算值(即不同元素的数量)。
- PFMERGE:将多个 HyperLogLog 合并为一个 HyperLogLog。
geospatial(地理空间)
使用场景:
附近的人
常用命令
string(字符串)
Redis 字符串存储字节序列,包括文本、序列化对象和二进制数组。因此,字符串是可以与 Redis 键关联的最简单的值类型。它们通常用于缓存,但它们支持附加功能,使您也可以实现计数器并执行按位运算。
使用场景:
缓存token、计数器、缓存一切。。。
常用命令
SET
存储一个字符串值。SETNX
仅当键尚不存在时才存储字符串值。对于实现锁很有用。GET
检索字符串值。MGET
在单个操作中检索多个字符串值。INCRBY
以原子方式递增(并在传递负数时递减)存储在给定键处的计数器。- 存在另一个用于浮点计数器的命令:
INCRBYFLOAT
。
list (列表)
使用场景:
最新发布的文章、生产者消费者模式、队列、栈。
常见命令
LPUSH
将新元素添加到列表的头部;RPUSH
添加到尾巴。LPOP
从列表头部删除并返回一个元素;RPOP
做同样的事情,但是从列表的尾部开始。LLEN
返回列表的长度。LMOVE
以原子方式将元素从一个列表移动到另一个列表。LTRIM
将列表缩小到指定的元素范围。BLPOP
从列表头部删除并返回一个元素。如果列表为空,则该命令将阻塞,直到有元素可用或达到指定的超时为止。BLMOVE
以原子方式将元素从源列表移动到目标列表。如果源列表为空,该命令将阻塞,直到有新元素可用。
set
使用场景:
网站 UV 统计(数据量巨大的场景还是 HyperLogLog
更适合一些)、共同关注(交集)、可能认识的人(差集)
常见命令
SADD
将新成员添加到集合中。SREM
从集合中删除指定的成员。SISMEMBER
测试字符串的集合成员资格。SINTER
返回两个或多个集合共有的成员集(即交集)。SCARD
返回集合的大小(也称为基数)。
hash
使用场景:
缓存对象
常见命令
zset (排序集)
Redis 排序集是按关联分数排序的唯一字符串(成员)的集合。当多个字符串具有相同分数时,字符串按字典顺序排序。排序集的一些用例包括:
- 排行榜。例如,您可以使用排序集轻松维护大型在线游戏中最高分数的有序列表。
- 速率限制器。特别是,您可以使用排序集构建滑动窗口速率限制器,以防止过多的 API 请求。
常用命令
ZADD
将新成员和关联分数添加到排序集中。如果该成员已存在,则更新分数。ZRANGE
返回在给定范围内排序的有序集的成员。ZRANK
返回所提供成员的排名,假设按升序排序。ZREVRANK
返回所提供成员的排名,假设排序集按降序排列。