Redis中特殊场景的数据类型(Streams、Geospatial indexes、Bitmaps、Bitfields、HyperLogLog)

redis官网关于数据类型的介绍: Understand Redis data types | Redis

本文简单讲解后物种数据类型的命令和应用场景。

Streams:

Stream是一种数据结构,其作用类似于仅附加日志。 Stream有助于按事件发生的顺序记录事件,然后将它们联合起来进行处理。 可以用作与阻塞队列。

在 Redis 中,Streams(流)是一种用于处理实时消息流的数据结构。它是一个有序的、可持久化的日志数据结构,类似于消息队列,但具有更丰富的功能。

Redis 提供了一组命令用于操作 Streams,以下是一些常用的 Streams 相关命令:

  1. XADD key [MAXLEN [~]|~] [ID field value ...]:将一个新的条目添加到指定的流中,并为条目分配一个唯一的 ID。
  2. XLEN key:获取指定流的长度,即流中包含的条目数量。
  3. XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]:从一个或多个流中读取指定 ID 之后的条目。可以指定读取的数量和阻塞时间。
  4. XGROUP CREATE key groupname id-or-$ [MKSTREAM]:创建一个新的消费者组,并将一个或多个流关联到该组。可以选择创建一个新的流以及在创建组时自动创建缺失的流。
  5. XREADGROUP GROUP groupname consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]:从消费者组中的一个或多个流中读取未被消费的条目。可以指定读取的数量、阻塞时间和是否自动确认消息。
  6. XACK key groupname ID [ID ...]:确认消费者组中的一个或多个条目。
  7. XCLAIM key groupname consumer min-idle-time ID [ID ...] [IDLE milliseconds] [TIME milliseconds] [RETRYCOUNT count] [JUSTID] [FORCE] [LASTID ID]:将一个或多个未确认的条目重新分配给指定的消费者。
  8. XDEL key ID [ID ...]:删除流中的一个或多个条目。
  9. XINFO STREAM key:获取有关指定流的信息,如长度、第一个和最后一个条目的 ID 等。

Streams 提供了一种非常灵活的方式来处理实时消息流,适用于许多实时应用场景,例如日志记录、实时数据处理、事件驱动架构等。通过使用 Streams,可以轻松地将消息流传输和处理集成到 Redis 中,并实现高效的消息传递和处理。

使用场景示例:

  1. 实时日志处理:将日志消息写入流中,然后使用消费者组对日志进行实时处理、筛选或存档。
  2. 事件驱动架构:使用 Streams 来处理和分发事件消息,不同的消费者组可以订阅不同类型的事件。
  3. 消息队列:Streams 可以充当高性能的消息队列,多个生产者可以将消息写入流中,多个消费者组可以并发地消费这些消息。

总之,Streams 是 Redis 中用于处理实时消息流的数据结构,提供了一组功能丰富的命令,适用于实时数据处理和事件驱动架构等场景。

Geospatial indexes:

用来存储经纬度坐标,我们存储了很多坐标之后,就可以让用户给我们一个坐标然后去查找周围的坐标点。这个功能在地图上应用广泛。

在 Redis 中,Geospatial Indexes 是一种用于存储和查询地理位置信息的索引结构。它允许你将地理位置(经度和纬度)与其他数据关联,并进行空间查询和计算。

Redis 提供了一组命令用于操作 Geospatial Indexes,以下是一些常用的 Geospatial 相关命令:

  1. GEOADD key longitude latitude member [longitude latitude member ...]:将一个或多个地理位置的经度、纬度和成员值添加到指定的键中。
  2. GEOPOS key member [member ...]:获取指定成员的经度和纬度信息。
  3. GEODIST key member1 member2 [unit]:计算两个成员之间的距离。可以选择不同的单位(如米、千米等)来返回结果。
  4. GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]:根据给定的经度、纬度和半径,在指定键的地理位置集合中查找满足条件的成员。可以选择返回坐标、距离、哈希值以及限制结果数量等。
  5. GEORADIUSBYMEMBER key member radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]:根据给定成员和半径,在指定键的地理位置集合中查找满足条件的成员。其他选项和 GEORADIUS 命令相同。
  6. GEOHASH key member [member ...]:获取指定成员的 Geohash 值。
  7. GEOOVERLAY key numkeys key [key ...] AGGREGATE SUM|MIN|MAX:对多个键的地理位置集合进行交集、并集或差集操作,并进行聚合计算。

这些命令提供了对地理位置数据进行存储、查询和计算的功能。你可以使用 Geospatial Indexes 来构建地理位置相关的应用,例如附近的人、地点推荐、地理围栏等。

需要注意的是,在使用 Geospatial Indexes 时,需要使用 Redis 的地理空间模块(Redis Geospatial Module)来启用这些命令。确保 Redis 实例已加载了该模块,并在使用相关命令之前进行适当的配置。

这是 Redis 中 Geospatial Indexes 相关命令的简介,它们提供了方便的地理位置数据处理能力,使你能够存储、查询和计算地理位置信息。

Bitmap:

Bitmaps位图:本质上还是一个集合,属于Set类型对整数的优化版本。

在 Redis 中,Bitmap 是一种位图数据结构,它允许在一个字符串中存储和操作二进制位。每个位可以是 0 或 1,因此 Bitmap 可以被用于表示一组开关、标记或者集合的成员关系。

Redis 提供了一系列命令用于操作 Bitmap 数据结构,以下是一些常用的 Bitmap 相关命令:

  1. SETBIT key offset value:将指定偏移量 offset 处的位设置为给定的值 value(0 或 1)。
  2. GETBIT key offset:获取指定偏移量 offset 处的位的值。
  3. BITCOUNT key [start end]:计算并返回指定范围内的位被设置为 1 的数量。可以通过提供可选的 startend 参数来指定范围,否则将计算整个 Bitmap 的位数。
  4. BITOP operation destkey key [key ...]:对一个或多个 Bitmap 进行逻辑运算,并将结果存储在目标键 destkey 中。逻辑运算可以是 AND、OR、XOR 或 NOT。
  5. BITPOS key bit [start] [end]:查找并返回指定位 bit(0 或 1)在 Bitmap 中的第一个出现的偏移量。可选的 startend 参数用于限制搜索范围。
  6. BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment]:对 Bitmap 进行位级别的读取、写入和增减操作。通过指定不同的 type(如 u8、i16、f32)和 offset,可以对指定位置的位进行操作。

使用 Bitmap 可以进行一些高效的操作,例如统计用户在线状态、记录用户行为、进行布隆过滤器等。

需要注意的是,Bitmap 是按照字节进行存储的,因此它可以存储非常大的位图数据,但也会占用相应的内存空间。在使用 Bitmap 时,需要根据实际情况合理控制内存的使用。

以上是 Redis 中 Bitmap 相关的命令简介,它们可以用于创建、操作和查询位图数据结构,提供了灵活而高效的处理二进制位的能力。

Bitfields:

Bitfields和C中的位域非常相似,后侧的数字描述这个成员变量占几个bit位,本质上是为我们提供了一种精准进行位操作的方法。

在 Redis 中,Bitfields(位域)是一种用于对字节级别的数据进行位级别的读取、写入和操作的数据结构。它允许你在一个字符串中以原子方式访问和修改特定位的值,类似于位图(Bitmap)数据结构。

Redis 提供了一组命令用于操作 Bitfields,以下是一些常用的 Bitfields 相关命令:

  1. BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment]:对指定键中的位域进行读取、写入和增减操作。你可以指定不同的 type(如 u8、i16、f32)和 offset 来对位域进行操作。
  2. BITFIELD key OVERFLOW WRAP|SAT|FAIL:设置位域操作的溢出行为。你可以选择在溢出时进行包装(WRAP)、饱和(SAT)或失败(FAIL)处理。
  3. BITFIELD key INCRBY type offset increment [OVERFLOW WRAP|SAT|FAIL]:对位域执行增减操作,并指定增量。同样,你可以设置溢出行为。
  4. BITFIELD key SET type offset value [OVERFLOW WRAP|SAT|FAIL]:将指定位域的值设置为给定的值。你可以选择溢出行为。

Bitfields 可以用于各种场景,包括但不限于以下示例:

  1. 状态标志:可以使用 Bitfields 来存储和操作各种状态标志。每个位可以表示一个特定的状态,例如开关状态、锁定状态等。通过对位域进行适当的读取和修改操作,可以高效地管理和查询状态信息。
  2. 访问控制列表(ACL):可以使用 Bitfields 来表示和控制访问权限。每个位可以表示一个特定的权限或角色,通过位域操作可以进行权限检查和授权管理。
  3. 统计数据:Bitfields 可以用于存储和统计各种计数值。每个位可以表示一个计数器,通过适当的增减操作可以实现计数和统计功能。
  4. 用户权限:可以将 Bitfields 用于表示和操作用户权限。每个位可以表示一个特定的权限,通过位域操作可以进行权限的分配和验证。

需要注意的是,Bitfields 是按字节进行存储的,因此它可以存储大量的位数据,但也会占用相应的内存空间。在使用 Bitfields 时,需要根据实际情况合理控制内存的使用。

总之,Bitfields 是 Redis 中用于位级别读取、写入和操作的数据结构,通过一组相关命令提供了灵活的位域操作功能。它可以应用于各种场景,包括状态管理、权限控制、计数和统计等。

HyperLogLog:

应用场景只有一个,估算集合中的元素个数。使用Set去统计UV(用户访问次数)会保存用户唯一标识,如果UV数据量非常大那么就要消耗很大的内存空间。HyperLogLog可以最多使用12KB去完成统计UV的工作。HyperLogLog不会去记录元素内容,但能够记住元素的特征,从而当添加元素的时候HyperLogLog就可以知道这个元素是新增的元素,还是已经存在的元素。但是HyperLogLog会有一点误差:(看不懂这个误差指的是整体的估算个数的误差,还是每一次添加元素是判断是都已经存在的误差,还是其他意思的误差)

The Redis HyperLogLog implementation uses up to 12 KB and provides a standard error of 0.81%.

pfadd:

添加数据,返回0或1:

复制代码
pfadd key element [element ...]

pfcount:

获取集合中元素个数,支持同时获取多个集合的元素个数:查询一个集合的元素个数的时间复杂度是O(1)。

复制代码
pfcount key [key ...] 

pfdebug:

内部命令,用于测试和开发

在 Redis 中,PFDEBUG 是一个用于 HyperLogLog(HLL)数据结构的调试命令。HyperLogLog 是一种用于估计基数(cardinality)的概率数据结构,它可以在消耗少量内存的情况下,对大型数据集的基数进行估计。

PFDEBUG 命令提供了一些有关 HyperLogLog 内部状态的信息,以帮助调试和分析 HLL 数据结构。它的语法如下:

复制

复制代码
PFDEBUG subcommand key [additional arguments]

其中,subcommand 可以是以下几种之一:

  • help:显示关于 PFDEBUG 命令的帮助信息。
  • digest:返回指定 HLL 的内部哈希摘要。
  • encoding:返回指定 HLL 的编码方式。
  • regdump:返回指定 HLL 的寄存器(register)值。
  • cardinality:返回指定 HLL 的基数估计值。
  • merge:将多个 HLL 合并为一个,并返回合并后的 HLL 基数估计值。
  • clear:清空指定 HLL。

key 参数是指定的 HyperLogLog 键名。

除了 help 子命令外,其他子命令都需要提供一个有效的 HLL 键名,并返回与该命令相关的信息。

PFDEBUG 命令对于了解和调试 HyperLogLog 数据结构非常有用。它使得在开发和优化使用 HyperLogLog 的应用程序时,能够更好地理解和分析 HLL 内部的状态和数据。

pfmerge:

合并两个HLL集合,返回ok.

复制代码
PFMERGE destkey [sourcekey [sourcekey ...]]

pfselftest:

也是内部命令:

PFSELFTEST 是 Redis 中的一个命令,用于执行 HyperLogLog(HLL)数据结构的自检测。

在 Redis 中,HyperLogLog 是一种用于估计基数(cardinality)的概率数据结构,它可以在消耗较少内存的情况下,对大型数据集的基数进行估计。PFSELFTEST 命令用于验证 Redis 是否正确地实现了 HyperLogLog 算法,并且确保 HyperLogLog 在当前环境下的工作正常。

使用 PFSELFTEST 命令非常简单,只需执行以下命令:

复制代码
PFSELFTEST

执行该命令后,Redis 会进行自检测并输出结果。如果输出结果为 "OK",则表示自检测通过,Redis 的 HyperLogLog 实现正常。如果输出结果为错误信息,则表示自检测失败,可能存在问题。

PFSELFTEST 命令通常在 Redis 启动时执行,以确保 Redis 在运行期间正常工作。如果自检测失败,建议检查 Redis 的安装和配置是否正确,或者尝试重新编译和安装 Redis。

总之,PFSELFTEST 是一个用于执行 HyperLogLog 自检测的命令,用于验证 Redis 是否正确实现了 HyperLogLog 算法,并确保其在当前环境下正常工作。

相关推荐
l1t2 小时前
利用DeepSeek实现服务器客户端模式的DuckDB原型
服务器·c语言·数据库·人工智能·postgresql·协议·duckdb
MarkHard1236 小时前
如何利用redis使用一个滑动窗口限流
数据库·redis·缓存
island13147 小时前
【Redis#10】渐进式遍历 | 数据库管理 | redis_cli | RES
数据库·redis·bootstrap
心想事成的幸运大王8 小时前
Redis的过期策略
数据库·redis·缓存
倔强的石头_8 小时前
CentOS 上安装KingbaseES(ISO包)详细教程
数据库
2401_897930068 小时前
使用Docker轻松部署Neo4j图数据库
数据库·docker·neo4j
诗句藏于尽头9 小时前
Django模型与数据库表映射的两种方式
数据库·python·django
寻星探路9 小时前
数据库造神计划第六天---增删改查(CRUD)(2)
java·大数据·数据库
盖世英雄酱5813610 小时前
Read timed out问题 排查
java·数据库·后端
云动雨颤11 小时前
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
数据库·spring boot·tomcat