Redis 核心概念解析:从渐进式遍历、数据库管理到客户端通信协议

发布于:2025-09-02 ⋅ 阅读:(20) ⋅ 点赞:(0)

前言

当你掌握了 Redis 的基础键值操作后,为了更高效、更安全地使用 Redis,深入理解其内部工作机制和高级功能至关重要。本文将带您超越基础,探讨三个核心主题:首先,我们将介绍如何通过 SCAN 命令进行渐进式遍历,以避免 KEYS 命令可能导致的服务器阻塞问题;其次,我们将了解 Redis 的数据库管理命令,学习如何切换和维护多个数据库空间;最后,我们将深入解析 Redis 客户端与服务器之间通信的基石——RESP 协议,揭示其高效、简洁的设计原理。通过掌握这些内容,您将能更专业地驾驭 Redis。

渐进式遍历

keys一次性的把整个redis中的所有key都获取到

keys * 这个操作是比较危险的,一下子获得了太多的key,会造成redis出现阻塞情况

但是我们通过渐进式遍历,就可以做到,既能获取到所有的key,同时又不会卡死服务器

渐进式不是一个命令,把所有的key都拿到,而是每执行一次命令,只获取其中的一小部分

想得到所有的key,就需要进行多次遍历了----多次执行渐进式遍历命令

渐进式遍历命令其实是一组命令,这一组命令的使用方式都是一样的

其中的代表命令是scan

cursor是光标,光标就指向了当前遍历的位置

如果光标设置为0,表示这次遍历是从头开始获取的

返回值的全班部分,是告诉你,下次遍历,光标要从哪里开始image.png

scan cursor [MATCH pattern] [COUNT count] [TYPE type]

时间复杂度是O(1)

MATCH pattern:
image.png

COUNT count:限制这一次遍历能够获取到多少个元素,默认是是10

TYPE type:redis里的key都是string ,但是value的类型是不一样,这里是让我们指定需要获取到的key的类型是啥

scan 0

设置光标为0,直接从起点开始进行遍历,
image.png
当我们的命令返回了0,说明我们的遍历是结束了的,都遍历完成了
image.png

scan 0 count 3

image.png
这里的返回值是1,那么下次就从1开始了

scan 1 count 3

image.png

服务器告诉我们下一次从哪里开始,我们就从哪里开始

count这里的数字,不是说每次遍历都得设置成一样

这里的渐进式遍历,在遍历过程中华,不会在服务器这边存储任何的状态信息
所以次数的遍历是随时可以终止的,不会对服务器产生任何的副作用的

渐进性遍历scan虽然解决了阻塞的问题,但是如果在遍历期间键有所变化(增加、修改、删除),可能导致遍历时键的重复或者遗漏image.png

数据库管理命令

redis其实也有database这样的概念的,但是不像mysql那样随意
redis中的database是现成的,用户是不能创建新的数据库的,也不能删除已有的数据库

默认redis给用户提供了16个数据库
这16个数据库中的数据是隔离的,相互之间不会影响

默认使用的就是0号数据库

使用命令进行数据库的切换

setlect index

index这个就是数据库的编号,数据库从0-15总共16个数据库
image.png

实际上redis很少关注数据库的,直接使用0号即可

获取到当前数据库的元素个数

dbsize

image.png

flushdb:删除当前数据库中的所有key

flushdb [ASYC | SYNC]

两个选项是同步和异步

flushall:删除所有数据库的所有key

Redis 客户端:基本介绍与 RESP 协议解析

Redis 客户端:基本介绍与 RESP 协议解析

Redis 作为一款高性能的内存数据库,其强大的功能需要通过客户端与服务器进行交互来实现。了解 Redis 客户端及其通信协议对于高效使用 Redis 至关重要。本文将对 Redis 客户端进行基本介绍,并深入解析其核心通信协议——RESP。

Redis 客户端基本介绍

Redis 客户端是与 Redis 服务器进行通信的程序或库。它负责将用户的命令发送到 Redis 服务器,并接收和解析服务器返回的响应。客户端可以分为两大类:

  • 命令行客户端 (CLI): 这是最基础的 Redis 客户端,例如 redis-cli。它允许开发者直接在终端中输入 Redis 命令并查看结果,非常适合用于调试和管理任务。

  • 图形用户界面 (GUI) 客户端: 为了更直观地管理 Redis 中的数据,社区开发了许多 GUI 客户端。这些工具通常提供树状的键值展示、数据增删改查的可视化操作界面,以及服务器状态监控等功能。常见的 GUI 客户端包括 Redis Desktop Manager (RDM)、Another Redis Desktop Manager 和 Tiny RDM 等。

  • 编程语言客户端库: 在应用程序中与 Redis 交互时,开发者会使用特定编程语言的 Redis 客户端库。这些库封装了与 Redis 服务器的通信细节,提供了简洁的 API 供开发者调用。几乎所有主流的编程语言,如 Java (Jedis, Lettuce)、Python (redis-py)、Node.js (node-redis) 等,都有成熟的 Redis 客户端库。

认识 RESP (REdis Serialization Protocol)

Redis 客户端与服务器之间的通信遵循一个名为 RESP (REdis Serialization Protocol) 的协议。 该协议在 Redis 1.2 中引入,并从 Redis 2.0 开始成为与 Redis 服务器通信的标准方式。 RESP 的设计目标是实现简单、解析快速且具有人类可读性。

RESP 协议的特点:

  • 实现简单: 协议规则清晰明了,易于在不同的客户端库中实现。
  • 解析快速: 协议的格式设计使得解析器可以高效地处理数据,对性能影响小。
  • 人类可读: RESP 传输的数据格式直观,便于开发者在调试过程中直接阅读和理解。
  • 二进制安全: 采用前缀长度来传输数据块,确保了二进制数据的安全传输。

RESP 数据类型:

RESP 协议支持多种数据类型,通过第一个字节的不同来区分:

  • 简单字符串 (Simple Strings):+ 开头,以 \r\n (CRLF) 结尾。例如 +OK\r\n
  • 错误 (Errors):- 开头,以 \r\n 结尾。例如 -ERR unknown command 'foobar'\r\n
  • 整数 (Integers):: 开头,以 \r\n 结尾。例如 :1000\r\n
  • 批量字符串 (Bulk Strings): 用于表示长度最大为 512MB 的单个二进制安全字符串。 它以 $ 开头,后跟字符串的字节数,然后是 CRLF,接着是实际的字符串数据,最后再以 CRLF 结尾。 例如,表示字符串 “hello”:$5\r\nhello\r\n
  • 数组 (Arrays): 客户端向服务器发送命令以及服务器返回元素集合时使用。 它以 * 开头,后跟数组中元素的个数,然后是 CRLF,接着是数组中的各个元素(可以是任意 RESP 类型)。 例如,发送命令 SET mykey "hello" 会被编码为:
    *3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$5\r\nhello\r\n
    

请求-响应模型:

Redis 的通信基于请求-响应模型。客户端将命令以 RESP 数组的形式发送给服务器。 服务器处理命令后,将结果以相应的 RESP 数据类型返回给客户端。 这种交互模式是 Redis 通信的核心。

总结

Redis 客户端是与 Redis 服务器交互的桥梁,而 RESP 协议则是它们之间沟通的语言。无论是通过简单直接的命令行工具,还是功能丰富的图形化界面,亦或是在代码中集成客户端库,其底层都依赖于 RESP 协议来确保高效、可靠的数据交换。对 RESP 协议的理解,有助于更深入地掌握 Redis 的工作原理,并在开发中更好地利用其性能优势。

总结

本文深入探讨了 Redis 的三项关键技术。首先,我们学习了使用 SCAN 命令进行渐进式遍历,它通过基于游标的迭代方式,解决了 KEYS 命令在处理大规模键时可能引发的阻塞风险,是安全遍历键空间的首选方案。
其次,我们介绍了 Redis 的数据库管理命令,例如用于切换数据库的 select 和清空数据库的 flushdb/flushall。这让我们了解到,虽然 Redis 提供了多数据库隔离的功能,但在实际应用中,通常建议聚焦于默认的 0 号数据库以简化管理。
最后,我们详细解析了 Redis 客户端与服务器交互的桥梁——RESP 协议。我们认识到,无论是通过命令行工具、图形化界面,还是在代码中集成客户端库,其底层都依赖于 RESP 协议来确保高效、可靠和人类可读的数据交换。对 RESP 协议的理解,有助于我们更深入地掌握 Redis 的工作原理,并在开发中更好地利用其性能优势。总之,掌握这些高级概念是提升 Redis 应用开发水平和运维能力的关键。