Redis(八) 类型补充

在这里插入图片描述

前言

在 Redis 中不仅只包含前面说的五种基本数据类型:string、list、hash、set、zset,redis 还提供了其他的数据类型来使得 redis 适合在一些特殊的使用场景下使用。

在这里插入图片描述

Stream

在这里插入图片描述
Redis Stream 是 Redis 5.0 中引入的一种数据类型,它提供了一种处理 Redis 数据库中数据流的方法。它主要设计用于消息传递和事件源应用程序,为存储和处理消息或事件序列提供强大且可扩展的解决方案。

Redis Stream 类型具有以下主要功能:

  1. 附加消息:与日志结构类似,我们可以在流的末尾附加新消息或事件。流中的每个条目都分配有一个唯一的 ID,该 ID 通常是确保顺序的基于时间戳的标识符。
  2. 持久存储:添加到流中的消息会被持久存储,这使得 Redis Streams 适合需要可靠消息存储的应用程序,例如消息队列或日志系统。
  3. 消费者和消费者组:Redis Streams支持多个消费者和消费者组,允许不同的消费者处理消息。该模型支持复杂的分布式应用程序,其中处理可能需要在多个节点之间划分。
  4. 阻塞读取:消费者可以以阻塞方式从流中读取数据,如果已经处理完所有可用消息,则等待新消息。此功能对于实时消息处理非常有用。
  5. 复杂操作支持:Redis 提供了一系列与流交互的命令,例如XADD添加消息、XRANGE检索XREVRANGE一系列消息、XREAD从一个或多个流读取以及XGROUP管理消费者组。
  6. 可扩展性和效率:Redis Streams 旨在高效处理大量消息,无论是在内存使用还是性能方面。

Redis Streams 在涉及实时数据馈送、日志聚合、微服务架构中的事件源以及构建消息队列的场景中特别有用。它们为管理数据流提供了高性能、耐用且易于使用的解决方案。

对于 Stream 类型,主要有四种命令:XADD、XREAD、XRANGE和XLEN。

  • XADD:向流中添加新的条目
  • XREAD:读取一个或多个条目,从给定位置开始,并在时间上向前移动。
  • XRANGE:返回两个提供的条目id范围之间的条目
  • XLEN:返回流的长度

XADD

XADD key [NOMKSTREAM] [<MAXLEN | MINID> [= | ~] threshold [LIMIT count]] <* | id> field value [field value ...]

  1. [NOMKSTREAM]:如果指定,如果流不存在,Redis 将不会自动创建该流。通常,如果流不存在,Redis 会在您向其中添加第一个条目时自动创建流。
  2. [<MAXLEN | MINID> [= | ~] threshold [LIMIT count]]:
    用于限制流大小的可选参数。
  • MAXLEN:将流修剪为一定数量的条目。它有助于将流保持在可管理的大小。
    • =:流被修剪为由 指定的确切条目数threshold。
    • ~:流大约被修剪到阈值大小。此选项的性能效率更高,并且可能会导致流比指定的稍大。
  • *MINID:通过删除 ID 低于指定值的条目来修剪流threshold。
    • =:删除所有ID小于或等于指定阈值的条目。
    • ~:与 = 类似,但可能更高效,因为它不能保证精确遵守阈值,从而可以更快地执行。
  • LIMIT count:可选子句,可与 MAXLEN 一起使用来限制单个操作中删除的条目数以提高性能。
  1. <* | id>:
  • *:告诉 Redis 自动为新条目生成一个 ID。该ID基于当前服务器时间,保证唯一且单调增长。
  • id: 您可以提供具体的 ID。这在需要外部控制或生成ID的场景中非常有用。提供的 ID 必须大于最近添加的条目的 ID。
  1. field value [field value …]:
    流中的每个条目都由字段值对组成。您可以指定一对或多对。
    这些是您存储在流条目中的实际数据元素。

时间复杂度:当添加新entry 的时候,为O(1),但是如果是截取指定范围内的 entry 时,为O(N),N是截取范围之外的 entry 的数量
返回值:新添加的消息的唯一ID

这个唯一ID是一个全局唯一的字符串,它由两部分组成:

  1. 毫秒级时间戳:表示消息被添加到 stream 的时间。
  2. 序列号:在相同的毫秒内,如果有多个消息被添加到 stream,那么这个序列号用于区分它们。

XADD 的返回值格式大致为 <timestamp>-<sequence-number>

例如,一个可能的返回值是 1593539400000-0,其中 1593539400000 是消息被添加的时间戳(以毫秒为单位),0 是该毫秒内的序列号。

这里具体的代码就不为大家展示了,这里我们只是作为了解。

XREAD

XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]

  • [COUNT count]:指定从每个流读取的最大条目数。如果省略,则没有特定限制,并且 Redis 将返回不超过其内部限制的所有可用条目。
  • [BLOCK milliseconds]:如果指定,该命令将阻塞指定的毫秒数,等待指定流之一中的数据不为空。0 值BLOCK可用于执行轮询读取。如果在指定时间内没有可用数据,该命令将返回空。这使得它适合在消费者中实现延迟或超时。

时间复杂度:O(N),其中 N 是读取的消息总数。
返回值:读取的一个或者多个 Stream 的名称和ID

XRANGE

XRANGE 命令获取指定范围的 stream 信息。XRANGE key start end [COUNT count]

时间复杂度:O(N),其中N是区间大小
返回值:指定区间stream的ID和stream中的字段和值

XLEN

XLEN 获取 stream 中元素的个数。XLEN key

时间复杂度:O(1)
返回值:stream中元素的个数

Geospatial

在这里插入图片描述

Geospatial 允许基于经度和纬度坐标存储、检索和查询地理空间数据。此功能构建在 Redis 的排序集之上,提供高效的地理空间数据索引和查询。

  1. 地理空间数据存储:Redis使用GEOADD命令来存储地理空间数据。此命令将一个或多个元素添加到 Redis 排序集中,每个元素由经度和纬度坐标以及位置名称组成。
  2. 半径查询:GEORADIUS和GEORADIUSBYMEMBER命令允许查询一定半径内的地理空间数据。GEORADIUS根据项目与给定坐标集的距离返回项目,而GEORADIUSBYMEMBER根据项目与已存储在地理空间索引中的位置的距离返回项目。
  • 这些命令还可以提供附加信息,例如返回的项目距搜索半径中心的距离,并且可以返回按距离排序的结果。
  1. 距离计算:该GEODIST命令计算数据集中两个地理空间项目之间的距离。它可以以各种单位(米、公里、英里或英尺)返回距离,从而根据应用要求提供灵活性。
  2. 位置检索:使用该GEOPOS命令,您可以检索地理空间索引中一项或多项的经度和纬度坐标。
  3. 哈希表示:该GEOHASH命令返回一个或多个元素位置的 Geohash 字符串表示。 Geohash 是一种将地理位置编码为短字母和数字字符串的系统,这对于利用此类表示的应用程序非常有用。

GEOADD

GEOADD key [NX | XX] [CH] longitude latitude member [longitude latitude member ...]

  • NX:当要添加的元素不存在时才添加成功(也就是该选项只能新增元素)
  • XX:只有当新添加的元素已经存在的时候才会修改已经存在的元素,如果要添加的元素不存在,则直接返回(该选型不能新增元素,只能修改元素的值)
  • CH:GEOADD 命令默认返回新增加元素的个数,使用该选项之后,也会返回修改了的元素的个数

时间复杂度:O(K*logN),k为添加的元素的个数,每添加一个元素的时间复杂度为logN
返回值:新添加的或者修改的元素的个数

GEOSEARCH

GEOSEARCH key <FROMMEMBER member | FROMLONLAT longitude latitude> <BYRADIUS radius <M | KM | FT | MI> | BYBOX width height <M | KM | FT | MI>> [ASC | DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]

  1. <FROMMEMBER member | FROMLONLAT longitude latitude>:
    命令的这一部分指定执行搜索的中心点。
  • FROMMEMBER member:使用地理空间索引中的现有成员作为搜索区域的中心。
  • FROMLONLAT longitude latitude:直接指定经纬度坐标作为搜索区域的中心。
  1. <BYRADIUS radius <M | KM | FT | MI> | BYBOX width height <M | KM | FT | MI>>:定义要搜索的区域的形状和大小。
  • BYRADIUS radius <unit>:在圆形区域内搜索。半径与其单位(米、公里、英尺或英里)一起指定。
  • BYBOX width height <unit>:在矩形区域内搜索。矩形的宽度和高度与单位一起指定。
  1. [ASC | DESC]:
  • ASC:按照距中心点距离的增加对结果进行排序。
  • DESC:按照与中心点的距离递减对结果进行排序。
  1. [COUNT count [ANY]]:限制返回结果的数量。
  • count:返回的最大结果数。
  • ANY:一个可选修饰符,使用时允许 Redis 返回少于count结果(如果可以更有效地这样做)。这对于更快但不太精确的搜索很有用。
  1. [WITHCOORD]:返回每个匹配项的经度和纬度。
  2. [WITHDIST]:包括每个返回项目距搜索中心的距离。
  3. [WITHHASH]:返回结果集中每个项目的 Geohash。

时间复杂度:O(N+log(M)),其中 N 是作为过滤器提供的形状周围的网格对齐边界框区域中的元素数量,M 是形状内的项目数量
返回值:每个地点的位置键、经纬度坐标和与搜索中心的距离。

1) 1) "location:1"  
   2) 1) "13.361388343296051"  
      2) "38.11555480957031"  
   3) "197.3375"  
2) 1) "location:2"  
   2) 1) "13.361540985107422"  
      2) "38.11570739746094"  
   3) "123.4567"  
// ... 可能还有其他位置信息

HyperLogLog

在这里插入图片描述
Redis HyperLogLog 是一种概率数据结构,提供了一种有效的方法来估计数据集的基数,即数据集中唯一元素的数量。 HyperLogLog 对于不需要精确计数但近似值就足够的大型数据集和应用程序特别有用,尤其是在节省内存至关重要时。HyperLogLog 不存储元素具体的值,而是存储元素的特征,这也正是 HyperLogLog 节省内存的关键。

HyperLogLog 类型具有下面特点:

  1. 空间效率:HyperLogLog 可以仅使用大约 12 KB 的内存来估计超过 10 亿个唯一项目的基数,标准误差为 0.81%。与需要更多内存来存储所有独特元素的传统方法相比,这使得它具有高度的空间效率。
  2. 易于使用:Redis 提供了一组简单的命令来操作 HyperLogLog 数据类型,从而可以轻松集成到应用程序中。
  3. 合并功能:可以将多个 HyperLogLog 合并在一起,以创建一个结合其数据集的单个 HyperLogLog。此功能在数据在不同位置或不同时间收集的分布式系统中特别有用。

PFADD

PFADD 向 HyperLogLog 中添加元素。PFADD key [element [element ...]]

<font color = “CC0000”.时间复杂度:O(K),K为添加元素的个数
返回值:添加元素的个数

PFCOUNT

PFCOUNT 获取 HyperLogLog 中元素的个数。PFCOUNT key [key ...]

时间复杂度:O(N),N为键的个数
返回值;一个或者多个键中元素个数

PFMERGE

PFMERGE 命令用于将多个HyperLogLog值合并为一个唯一值。这个合并后的值的基数估算值将接近于观察到的源HyperLogLog结构集的并集的基数。PFMERGE destkey [sourcekey [sourcekey ...]]

时间复杂度:O(N),其中 N 是合并操作中涉及的 HyperLogLog 数据结构的数量。
返回值:OK

BITMAP

在这里插入图片描述

Redis bitmap 不是一种独特的数据类型,而是一组应用于 Redis 字符串的位级操作。这些字符串本质上是一个位数组,并且它们非常节省空间。位图对于涉及计算唯一用户、功能切换的场景或需要在数据集中的任意位置操作和测试位的任何其他场景非常有用。

bitmap 的主要特点:

  1. 空间效率:位图使用很少的内存,这使得它们非常适合表示具有高基数的数据,例如数百万用户或对象,特别是当您跟踪简单的二进制状态(例如,活动/非活动、已访问/未访问)时。
  2. 位级操作:Redis 提供命令来设置、清除和测试字符串中特定位置的位、计算设置位、查找设置或未设置位等。
  3. 原子位操作:设置位或测试位等操作是原子的,使得 Redis 位图适合并发用例。

SETBIT

SETBIT 设置或清除字符串中特定偏移处的位。该命令采用密钥、位位置(偏移量)和值(1 或 0)。SETBIT key offset value

时间复杂度:O(1)
返回值:原始位在 offset 处的位被设置之前的值(0 或 1)。

GETBIT

GETBIT 检索字符串中特定偏移处的位的值。GETBIT key offset

<font color = “CC0000”.时间复杂度:O(1)
返回值:对应 offset 出的位值

BITFIELD

在这里插入图片描述
RedisBITFIELD是 Redis 3.2 中引入的命令,与标准位图操作相比,它允许用户以更精细的方式对字符串(Redis 表示为位数组)执行复杂的操作。它扩展了 Redis 的能力,以处理较大字符串(或位图)中的不同位宽度和任意非字节对齐字段。此功能提供了对如何在大型位数组中存储和操作整数的更高程度的控制,从而针对特定用例优化了空间和性能。

BITFIELD 的主要特点:

  1. 自定义位字段:BITFIELD允许您在 Redis 字符串中的任何位置定义自定义大小的字段。您可以操作跨越不同长度和任意偏移的位。当您需要紧密且高效地打包数据而不遵守标准字节或字大小时,这特别有用。
  2. 原子操作:与其他 Redis 操作一样,BITFIELD命令是原子的,这使得它们可以在并发场景中安全使用,而不需要额外的锁定机制。
  3. 非字节对齐访问:与对特定字节或对齐位集进行操作的传统位操作不同,BITFIELD它可以对不与字节或字边界对齐的位进行操作,从而在数据结构和存储方式上提供更大的灵活性。
  4. 溢出处理:该命令允许为超出其位字段正常容量的操作指定溢出行为。例如,您可以选择环绕、饱和(上限为最大可能值)或在发生溢出时使操作失败。

BITFIELD

BITFIELD key [GET encoding offset | [OVERFLOW <WRAP | SAT | FAIL>] <SET encoding offset value | INCRBY encoding offset increment> [GET encoding offset | [OVERFLOW <WRAP | SAT | FAIL>] <SET encoding offset value | INCRBY encoding offset increment> ...]]

  1. GET encoding offset:检索指定位字段的值。
  • encoding:指定整数的类型和大小。例如,u8对于无符号 8 位整数,s16对于有符号 16 位整数。格式为[u|s],其中u代表无符号,s代表有符号,是位数。
  • offset:字符串中开始读取值的位偏移量。
  1. SET encoding offset value:设置指定位字段的值。
  • value:使用指定编码在指定偏移处设置的整数值。
  1. INCRBY encoding offset increment:将指定位字段的值增加给定的增量。
  • increment:字段值增加的量。
  1. OVERFLOW <WRAP | SAT | FAIL>:指定SET和INCRBY操作的溢出行为。这必须在它应该影响的操作之前声明。
  • WRAP:允许数字在溢出时回绕。例如,将 255 加 1 会导致u8编码结果为 0。
  • SAT(saturate):当发生上溢或下溢时,将值限制为最大或最小可能值。例如,将 255 加 1 会导致u8编码为 255。
  • FAIL:如果发生上溢或下溢,则运算失败。

时间按复杂度:对于指定的每个子命令,O(1)

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不能再留遗憾了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值