第21章 排序

还原SORT对象数组、数值与字典序比较、BY外部键、LIMIT、GET、STORE和选项执行顺序 覆盖10个正式节点,并以Redis 3.0源码、故障和恢复对账验收。

学习目标

  • 能使用 SORT 对集合类键排序
  • 能用 BY 按外部键值排序
  • 能用 GET 取回关联外部内容

为什么从“SORT选项执行管线台”开始

第21章 排序的核心任务是还原SORT对象数组、数值与字典序比较、BY外部键、LIMIT、GET、STORE和选项执行顺序。命令返回值只暴露外层合同;实现解释还必须连接内存结构、写入与读取路径、事件顺序以及失败后的旧状态回收。SORT选项执行管线台把这些关系放进同一条可复位轨迹。

先写预测:当比较方式由“ALPHA”进入“BY外部键”时,哪个可观察状态最先变化?再规定什么结果会推翻当前解释。交互中的分数只表达透明因果方向,不冒充真实Redis测量。

来源、版次与独立重写边界

黄健宏作者读者服务页确认正式出版新版以Redis 3.0为源码基线,列出4部分、24章及完整小节,并链接Redis 3.0中文注释源码。本课程据此映射24个正式单元、145个目录节点,另设学习地图和总复习;未取得出版正文授权,目录只界定范围,不宣称复现原书正文。

本章字段与控制流由Redis官方3.0源码:sort.c和作者注释源码交叉核对;Redis当前持久化文档只用于辨认版本差异。中文解释、图示、交互、实验与答案均为独立教学重写,不把目录页或代码仓库许可证误报为原书许可证。

本章术语与源码合同

第21章 排序必须守住“输入元素、比较键、排序方向、分页与输出投影按固定顺序组合,缺失外部键语义一致”。观察同时记录SORT选项执行管线台一致率与输出阶段分叉风险;只有结构快照、函数入口、运行结果和故障反例互相一致,才接受实现结论。

⚡ 集群消息类型与处理
集群消息类型MEET新节点加入集群的握手请求PING定期探测节点可达性PONGPING 的回复,携带自身状FAIL报告某节点疑似下线PUBLISH广播发布订阅消息UPDATE通知槽位配置变更MEET新节点加入集群的握手请求消息携带:发送方节点信息、配置纪元、槽位图等。gossip 消息随机选择目标,降低网络开销。
消息历史
尚未发送消息

作者目录逐项深读

SORT <key>命令的实现

四级证据 1/10。 SORT先把输入元素包装为待排序对象,再计算比较键;后续分页、GET投影和STORE基于排序结果。本节点用“SORT <key>命令的实现”作观察点,执行rg 'sortCommand|lookupKeyByPattern' src/sort.c或等价源码探针,保存版本、输入、前后状态和能推翻解释的反例。

验证SORT <key>命令的实现时,先预测比较方式从“ALPHA”切到“BY外部键”会改变哪个字段、偏移、文件或消息;再固定输出阶段做一次对照。若故障注入没有破坏“输入元素、比较键、排序方向、分页与输出投影按固定顺序组合,缺失外部键语义一致”,就撤回当前解释而不是补写故事。

ALPHA选项的实现

四级证据 2/10。 ALPHA把比较从数值转换为字符串字典序,不能与默认数值解析结果混用。本节点用“ALPHA选项的实现”作观察点,执行rg 'sortCommand|lookupKeyByPattern' src/sort.c或等价源码探针,保存版本、输入、前后状态和能推翻解释的反例。

验证ALPHA选项的实现时,先预测比较方式从“ALPHA”切到“BY外部键”会改变哪个字段、偏移、文件或消息;再固定输出阶段做一次对照。若故障注入没有破坏“输入元素、比较键、排序方向、分页与输出投影按固定顺序组合,缺失外部键语义一致”,就撤回当前解释而不是补写故事。

ASC选项和DESC选项的实现

四级证据 3/10。 ASC或DESC只反转比较方向,不改变BY键解析、LIMIT窗口或GET投影规则。本节点用“ASC选项和DESC选项的实现”作观察点,执行rg 'sortCommand|lookupKeyByPattern' src/sort.c或等价源码探针,保存版本、输入、前后状态和能推翻解释的反例。

验证ASC选项和DESC选项的实现时,先预测比较方式从“ALPHA”切到“BY外部键”会改变哪个字段、偏移、文件或消息;再固定输出阶段做一次对照。若故障注入没有破坏“输入元素、比较键、排序方向、分页与输出投影按固定顺序组合,缺失外部键语义一致”,就撤回当前解释而不是补写故事。

BY选项的实现

四级证据 4/10。 BY按模式为每个元素查外部比较键;BY nosort可跳过排序但仍执行后续LIMIT和GET。本节点用“BY选项的实现”作观察点,执行rg 'sortCommand|lookupKeyByPattern' src/sort.c或等价源码探针,保存版本、输入、前后状态和能推翻解释的反例。

验证BY选项的实现时,先预测比较方式从“ALPHA”切到“BY外部键”会改变哪个字段、偏移、文件或消息;再固定输出阶段做一次对照。若故障注入没有破坏“输入元素、比较键、排序方向、分页与输出投影按固定顺序组合,缺失外部键语义一致”,就撤回当前解释而不是补写故事。

带有ALPHA选项的BY选项的实现

四级证据 5/10。 ALPHA把比较从数值转换为字符串字典序,不能与默认数值解析结果混用。本节点用“带有ALPHA选项的BY选项的实现”作观察点,执行rg 'sortCommand|lookupKeyByPattern' src/sort.c或等价源码探针,保存版本、输入、前后状态和能推翻解释的反例。

验证带有ALPHA选项的BY选项的实现时,先预测比较方式从“ALPHA”切到“BY外部键”会改变哪个字段、偏移、文件或消息;再固定输出阶段做一次对照。若故障注入没有破坏“输入元素、比较键、排序方向、分页与输出投影按固定顺序组合,缺失外部键语义一致”,就撤回当前解释而不是补写故事。

LIMIT选项的实现

四级证据 6/10。 LIMIT在完成排序后按offset与count截取窗口,负数和越界必须按命令语义处理。本节点用“LIMIT选项的实现”作观察点,执行rg 'sortCommand|lookupKeyByPattern' src/sort.c或等价源码探针,保存版本、输入、前后状态和能推翻解释的反例。

验证LIMIT选项的实现时,先预测比较方式从“ALPHA”切到“BY外部键”会改变哪个字段、偏移、文件或消息;再固定输出阶段做一次对照。若故障注入没有破坏“输入元素、比较键、排序方向、分页与输出投影按固定顺序组合,缺失外部键语义一致”,就撤回当前解释而不是补写故事。

GET选项的实现

四级证据 7/10。 GET为窗口内每个元素按模式投影一个或多个值,#表示元素本身。本节点用“SORT <key>命令的实现”作观察点,执行rg 'sortCommand|lookupKeyByPattern' src/sort.c或等价源码探针,保存版本、输入、前后状态和能推翻解释的反例。

验证GET选项的实现时,先预测比较方式从“ALPHA”切到“BY外部键”会改变哪个字段、偏移、文件或消息;再固定输出阶段做一次对照。若故障注入没有破坏“输入元素、比较键、排序方向、分页与输出投影按固定顺序组合,缺失外部键语义一致”,就撤回当前解释而不是补写故事。

STORE选项的实现

四级证据 8/10。 STORE把最终投影保存为列表并返回元素数;写入目标键属于命令副作用和传播范围。本节点用“ALPHA选项的实现”作观察点,执行rg 'sortCommand|lookupKeyByPattern' src/sort.c或等价源码探针,保存版本、输入、前后状态和能推翻解释的反例。

验证STORE选项的实现时,先预测比较方式从“ALPHA”切到“BY外部键”会改变哪个字段、偏移、文件或消息;再固定输出阶段做一次对照。若故障注入没有破坏“输入元素、比较键、排序方向、分页与输出投影按固定顺序组合,缺失外部键语义一致”,就撤回当前解释而不是补写故事。

多个选项的执行顺序

四级证据 9/10。 语义顺序是构造元素、计算比较键、排序、LIMIT、GET投影、STORE,而不是按命令文本中选项出现顺序。本节点用“ASC选项和DESC选项的实现”作观察点,执行rg 'sortCommand|lookupKeyByPattern' src/sort.c或等价源码探针,保存版本、输入、前后状态和能推翻解释的反例。

验证多个选项的执行顺序时,先预测比较方式从“ALPHA”切到“BY外部键”会改变哪个字段、偏移、文件或消息;再固定输出阶段做一次对照。若故障注入没有破坏“输入元素、比较键、排序方向、分页与输出投影按固定顺序组合,缺失外部键语义一致”,就撤回当前解释而不是补写故事。

重点回顾

四级证据 10/10。 第21章 排序的回顾要重新证明“输入元素、比较键、排序方向、分页与输出投影按固定顺序组合,缺失外部键语义一致”,并用同一输入比较结构前态、变更轨迹、故障首错与恢复后态

验证重点回顾时,先预测比较方式从“ALPHA”切到“BY外部键”会改变哪个字段、偏移、文件或消息;再固定输出阶段做一次对照。若故障注入没有破坏“输入元素、比较键、排序方向、分页与输出投影按固定顺序组合,缺失外部键语义一致”,就撤回当前解释而不是补写故事。

最小源码与运行切片

+git clone --branch 3.0 --depth 1 https://github.com/redis/redis.git redis-3.0
+cd redis-3.0
+rg 'sortCommand|lookupKeyByPattern' src/sort.c

该切片固定Redis 3.0分支、编译器、配置、数据集和命令序列;先保存结构或函数位置,再运行隔离实例。任何持久化损坏、断线、故障转移、大键或高流量实验都必须使用临时数据并规定CPU、内存、磁盘、延迟和停止上限。

unit: rdi-21-sort
source_file: sort.c
axis_a: "比较方式"
axis_b: "输出阶段"
fault: "按参数书写顺序执行所有选项,导致比较、分页、投影和保存的语义错位"
invariant: "输入元素、比较键、排序方向、分页与输出投影按固定顺序组合,缺失外部键语义一致"
replay: same_version_same_input

三个必须主动触发的误区

误区 1

现象 → 对大集合直接 SORT 原因 → 阻塞服务器数秒 修法 → 控制规模或用 STORE 缓存

误区 2

现象 → BY 引用不存在键 原因 → 权重缺失排序意外 修法 → 先确认外部键存在

误区 3

现象 → ALPHA 与数值混用 原因 → 排序结果不符合预期 修法 → 明确排序模式再执行

小结

  • SORT 排序列表、集合与有序集
  • BY 与 GET 引用外部键
  • 默认按数值升序排序
  • ALPHA 切换为字典序
  • STORE 把结果存为新键

练习、答案与节点验证

练习

问题 1: BY 与 GET 的区别?

问题 2: SORT 的 STORE 选项解决什么问题?

问题 3: 对用户分数哈希用 SORT+BY+GET 输出 Top10 用户名。(独立实现)

术语复核与本章回顾

完成第21章 排序意味着能从sort.c解释还原SORT对象数组、数值与字典序比较、BY外部键、LIMIT、GET、STORE和选项执行顺序,能运行章专属状态实验,能制造反例并在复位后证明旧状态没有残留。

资料与写作方式声明

本章以黄健宏《Redis设计与实现》(机械工业出版社)权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…