第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选项执行管线台一致率与输出阶段分叉风险;只有结构快照、函数入口、运行结果和故障反例互相一致,才接受实现结论。
作者目录逐项深读
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和选项执行顺序,能运行章专属状态实验,能制造反例并在复位后证明旧状态没有残留。