# 服务器列表实时字段排序设计 **日期**: 2026-06-08 ## 背景 `GET /api/servers/` 在 MySQL 层 `ORDER BY` 后分页,再用 Redis heartbeat 覆盖 `is_online`、`last_heartbeat`、`agent_version`、`status`。展示值与排序键不一致,导致状态/心跳/Agent 列排序无效。 ## 目标 对 `sort_by ∈ {status, heartbeat, agent_version}`:overlay 全量筛选结果后内存排序,再分页返回。 ## 方案 1. `server_repo.get_filtered()` 拉取筛选后全量(上限 5000) 2. Redis pipeline 批量 `HGETALL heartbeat:{id}` 3. `server_list_sort.sort_server_items()` 按 UI 语义排序 4. `slice[offset:offset+per_page]` 静态列(name/domain/category/target_path/id)仍 DB 排序。 ## 排序语义 | 字段 | 键 | |------|-----| | status | online(0) → offline(1) → unknown(2),tiebreaker name | | heartbeat | ISO 时间;缺失置后(升序/降序均置后) | | agent_version | 字符串;空置后 | ## 性能 ≤5000 台 × 一次 pipeline + 内存 sort;运维列表低频可接受。 ## 验收 见 `docs/changelog/2026-06-08-servers-live-sort-fix.md`