当前位置: 首页 > news >正文

Redis ⑧-RESP | 渐进式遍历 | 数据库管理

在这里插入图片描述
Redis data-types
除了之前学习的 stringhashlistsetZset 五种数据结构之外,Redis 还提供了 bitmapbitfieldhyperlogloggeospatialstream 等数据结构。

另外的一些数据结构,都是在某些特定环境下才会使用,使用频率不高,不如前面介绍的 stringhashlistsetZset

类型补充

stream

Redis stream is a data structure that acts like an append-only log but also implements several operations to overcome some of the limits of a typical append-only log. These include random access in O(1) time and complex consumption strategies, such as consumer groups. You can use streams to record and simultaneously syndicate events in real time.

Redis stream 是一种类似于追加日志的数据结构,但它还实现了一些操作,克服了典型的追加日志的一些限制。这些操作包括随机访问时间复杂度为 O(1) 的能力,以及复杂的消费策略,例如消息队列。你可以使用 stream 记录并同时同步实时事件。

  • stream 可以用于模拟事件传播机制,追踪用户的点击等事件。传感器监测,从设备中读取。通知,将每个用户的通知记录存储在单独的流中。
  • stream 就是一个消息队列,属于是 blpopbrpop 的升级版。

geospatial

Redis geospatial indexes let you store coordinates and search for them. This data structure is useful for finding nearby points within a given radius or bounding box.

Redis 地理空间索引允许你存储坐标并搜索它们。这种数据结构对于查找给定半径或边界框内的邻近点很有用。

  • geospatial 主要在地图应用中使用,可以用来查找附近的点。

hyperloglog

HyperLogLog is a probabilistic data structure that estimates the cardinality of a set. As a probabilistic data structure, HyperLogLog trades perfect accuracy for efficient space utilization.The Redis HyperLogLog implementation uses up to 12 KB and provides a standard error of 0.81%.

HyperLogLog 是一种概率数据结构,可以估计集合的基数。作为一个概率数据结构,HyperLogLog 采用牺牲精确度来换取空间利用率。Redis HyperLogLog 实现使用了 12 KB 的空间,提供的标准误差为 0.81%。

  • 单纯的使用 set 进行计数时,需要的内存可能会比较大,而 HyperLogLog 则可以提供一个相对较小的内存占用。
  • HyperLogLog 用于估算集合中的元素个数,主要用于基数统计,比如统计用户的 UV、IP 等。
  • HyperLogLog 不存储实际元素的内容,但是能够通过记录"元素的特征",知道该元素是否已经存在,或者未存在,这就导致不能通过 HyperLogLog 里存的内容来得到实际的元素内容

bitmap

Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type which is treated like a bit vector. Since strings are binary safe blobs and their maximum length is 512 MB, they are suitable to set up to 2^32 different bits.

位图不是一种数据类型,而是一组位向操作定义在 String 类型上,它被视为一个位向量。由于字符串是二进制安全的块,其最大长度为 512 MB,因此,它们适合设置 2^32 不同的位。

  • bitmaphyperloglog 类似,都是用于计数的一种数据结构。
  • bitmap 只能存储整数类型,但其不同于 hyperloglog,其可以得到原始的元素内容。但其空间占用没有比 hyperloglog 小。

bitfield

Redis bitfields let you set, increment, and get integer values of arbitrary bit length. For example, you can operate on anything from unsigned 1-bit integers to signed 63-bit integers.These values are stored using binary-encoded Redis strings. Bitfields support atomic read, write and increment operations, making them a good choice for managing counters and similar numerical values.

Redis 位域(bitfield)允许您设置、递增和获取任意位长度的整数值。例如,您可以对无符号 1 位整数到有符号 63 位整数进行操作。这些值使用二进制编码的 Redis 字符串存储。位域支持原子读取、写入和递增操作,因此,它们是管理计数器和类似数字值的好选择。

  • bitfield 和 C 语言中的位域类似,可以对整数进行操作。可以理解成一串二进制序列(字节数组)。
  • 同时可以把这个字节数组中的某几位,赋予特定的含义,并且可以进行 读取、修改、算术运算等相关操作。
  • 使用位域进行存储,比 string/hash 来说,更节省空间。
    Redis bitfields

渐进式遍历

通过使用 keys * 可以获取 Redis 数据库中所有的键,但是这种方式会导致 Redis 服务器的阻塞。

因此 Redis 提供了渐进式遍历的方法,可以避免阻塞。

渐进式遍历的基本思想是,每次只扫描一部分键,然后下次再扫描下一部分,直到扫描完所有键

渐进式遍历命令

SCAN

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
  • cursor:表示光标,是一个整数值,表示此次遍历要开始扫描的起始位置。执行 SCAN 命令时,Redis 会返回一个游标值,下次再执行 SCAN 命令时,需要将这个游标值作为 cursor 参数传入,以便继续扫描。
  • MATCH pattern:表示匹配模式,可以指定 SCAN 命令只扫描符合给定模式的键。与 KEYS 命令的 pattern 参数类似。
  • COUNT count:表示每次扫描的数量,这是一个建议的值,也就是说,每次遍历得到的值不一定就一定是 count 个。默认值为 10。
  • TYPE type:表示键的类型,可以指定 SCAN 命令只扫描指定类型的键。

示例

127.0.0.1:6379> scan 0 count 3 // 起始从 0 开始扫描
1) "2"
2) 1) "k6"2) "k4"3) "k3"
127.0.0.1:6379> scan 2 count 3 // 此时从 2 开始扫描
1) "13"
2) 1) "k9"2) "k7"3) "k10"
127.0.0.1:6379> scan 13 count 3 // 此时从 13 开始扫描
1) "15"
2) 1) "k5"2) "k2"3) "k1"
127.0.0.1:6379> scan 15 count 3 // 此时从 15 开始扫描
1) "0"
2) 1) "k8"
// 返回 0 表示已经扫描完所有键

SSCAN

SSCAN key cursor [MATCH pattern] [COUNT count]
  • 扫描 set 类型的键。

HSCAN

HSCAN key cursor [MATCH pattern] [COUNT count]
  • 扫描 hash 类型的键。

ZSCAN

ZSCAN key cursor [MATCH pattern] [COUNT count]
  • 扫描 Zset 类型的键。

注意

Redis 的渐进式遍历,是不会在服务器这边存储任何状态信息的。也就是可以随时终止遍历,且不会对服务器产生其他影响。

虽然渐进式遍历解决了阻塞的问题,但如果在遍历期间键有所变化(增加、修改、删除),可能导致遍历时键的重复遍历或者遗漏,这点务必在实际开发中考虑。


数据库

Redis 不同于其他像 MySQL 这样的关系型数据库,其是不能对数据库进行增加或者删除操作的。

Redis 提供了 16 个数据库,编号为 0 到 15。不可对其进行增加或者删除操作。

这 16 个数据库,相互隔离,互不干扰。

数据库管理命令

SELECT

SELECT index
  • 切换到指定编号的数据库,index 为数据库编号,范围为 0 到 15。

FLUSHDB

FLUSHDB [ASYNC | SYNC]
  • 清空当前数据库的所有键。
  • ASYNC:表示异步执行,Redis 不会等待所有命令执行完毕才返回。
  • SYNC:表示同步执行,Redis 会等待所有命令执行完毕才返回。

FLUSHALL

FLUSHALL [ASYNC | SYNC]
  • 清空所有数据库的所有键。

DBSIZE

DBSIZE
  • 返回当前数据库的键数量。

SWAPDB

SWAPDB index1 index2
  • 此命令可以交换两个 Redis 数据库,这样连接到给定数据库的所有客户端都会立即看到另一个数据库的数据,反之亦然。
  • index1index2 为数据库编号,范围为 0 到 15。

RESP

RESP官方文档
RESP (REdis Serialization Protocol) 是 Redis 自己定义的一种协议。

Redis 客户端和 Redis 服务器之间通信的协议,可以在其他 client-server 项目中使用。

RESP 的优点:

  1. Simple to implement.
  2. Fast to parse.
  3. Human readable.

RESP can serialize different data types including integers, strings, and arrays. It also features an error-specific type. A client sends a request to the Redis server as an array of strings. The array’s contents are the command and its arguments that the server should execute. The server’s reply type is command-specific

RESP 可以序列化不同的数据类型,包括整数、字符串和数组。它还有一个特定的错误类型。客户端发送一个数组,数组的内容是命令及其参数,服务器应该执行的命令。服务器的回复类型是命令特定的。

RESP is binary-safe and uses prefixed length to transfer bulk data so it does not require processing bulk data transferred from one process to another

RESP 是二进制安全的,并且使用前缀长度传输大块数据,因此不需要从一个进程到另一个进程传输大块数据。

A client connects to a Redis server by creating a TCP connection to its port (the default is 6379).

客户端通过创建 TCP 连接到 Redis 服务器的端口(默认是 6379)。

While RESP is technically non-TCP specific, the protocol is used exclusively with TCP connections (or equivalent stream-oriented connections like Unix sockets) in the context of Redis.

RESP 虽然技术上不是 TCP 专用的,但是协议仅用于 Redis 的 TCP 连接(或等效的流式连接,如 Unix 套接字)。

The Redis server accepts commands composed of different arguments. Then, the server processes the command and sends the reply back to the client.This is the simplest model possible.

Redis 服务器接受不同参数组成的命令。然后,服务器处理命令并将回复发送回客户端。这是最简单的模型。

相关文章:

  • 机器人--主机--控制系统
  • YOLOv8模型训练过程
  • MCP:智能家居的“大脑”,如何引领未来居住革命
  • LangChain4j +DeepSeek大模型应用开发——7 项目实战 创建硅谷小鹿
  • Python Cookbook-6.14 实现状态设计模式
  • DeepSeek 赋能自然语言处理:从理论到实践的全方位解析
  • Qt指南针
  • 支持selenium的chrome driver更新到136.0.7103.49
  • 打包 Python 项目为 Windows 可执行文件:高效部署指南
  • 33、VS中提示“以下文件中的行尾不一致。是否将行尾标准化?“是什么意思?
  • 【C语言练习】014. 使用数组作为函数参数
  • Java关键字解析
  • Canvas特效实例:黑客帝国-字母矩阵(字母雨)
  • OpenAI最新发布的GPT-4.1系列模型,性能体验如何?
  • 设计模式简述(十四)组合模式
  • Unity SpriteMask(精灵遮罩)
  • Go 语言中一个功能强大且广泛使用的数据验证库github.com/go-playground/validator/v10
  • Js扩展DOM、BOM、AJAX、事件、定时器
  • 系统架构设计师:设计模式概述
  • 为 Unity 项目添加自定义 USB HID 设备支持 (适用于 PC 和 Android/VR)-任何手柄、无人机手柄、摇杆、方向盘
  • “80后”杨占旭已任辽宁阜新市副市长,曾任辽宁石油化工大学副校长
  • 美国参议院投票通过戴维·珀杜出任美国驻华大使
  • 腾讯重构混元大模型研发体系:成立大语言和多模态模型部,提升AI长期技术作战能力
  • 西班牙葡萄牙电力基本恢复
  • 病人有头发,照护者不发疯:《黑镜》中的身体缺席与虚伪关怀
  • “上报集团文化助力区域高质量发展赋能平台”揭牌