资讯动态

Valkey 如何用 HOTKEYS 命令发现并观察高 QPS 热点 key?

发布时间:2026/9/13 13:51:17 来源:尧图企业网站定制
Valkey 如何用 HOTKEYS 命令发现并观察高 QPS 热点 key【免费下载链接】placeholderkvA flexible distributed key-value database that is optimized for caching and other realtime workloads.项目地址: https://gitcode.com/GitHub_Trending/pl/placeholderkv当某个 key 的访问量远高于其他 key 时它会把压力集中在单分片上。Valkey 的HOTKEYS命令9.2.0 起提供会对客户端的 key 访问做采样并按窗口统计出访问最频繁的 key 及其估算 QPS让你用一条命令就能回答“最近一个窗口里哪些 key 最热”。热点检测默认关闭不消耗任何资源。因此完整路径是先用三个配置项开启检测再用HOTKEYS GET读取热点列表、用INFO hotkeys判断报告的可信度最后用HOTKEYS RESET清理统计状态。这些配置项和窗口语义见 valkey.conf 的 “HOT KEY DETECTION” 章节。开启检测hotkeys-top-k、采样比例与窗口长度valkey.conf中提供三个配置项控制检测的开关、开销与精度hotkeys-top-k默认0要跟踪的最热 key 数量同时充当开关。0完全禁用检测任意正值启用检测并决定 Space-Saving 算法的容量。预期热点较多、想要更长的排名列表时调大它。hotkeys-sampling-percentage默认1采样百分比取值 1–100100表示每次访问都采样。调低可减小高吞吐服务器上的开销代价是精度下降。hotkeys-window-seconds默认1报告窗口长度秒。访问先累积在“进行中”的 live window 里HOTKEYS GET报告的是最近一个已完成冻结的窗口。三个配置都支持运行期通过CONFIG SET修改无需重启。修改后进行中的窗口会重新计数但最近一个已完成窗口及其产生时的配置会保留仍在执行的HOTKEYS GET依然能读到它valkey-cli config set hotkeys-top-k 16 valkey-cli config set hotkeys-sampling-percentage 100 valkey-cli config set hotkeys-window-seconds 1用下面的命令确认开关已生效配置回读值为16valkey-cli config get hotkeys-top-k采样比例和窗口长度要配合选择二者共同决定报告的量化步长最小可报告的非零速率约为100 / (采样百分比 × 窗口秒数)QPS某个 key 在一个窗口内的期望采样数为qps × 采样百分比 / 100 × 窗口秒数。按默认值1%、1s每个报告值都是 100 QPS 的整数倍只有大约 10k QPS 以上的 key 才有可信的数字。要分辨更低速率的 key应提高采样百分比和/或加长窗口。读取热点列表HOTKEYS GETvalkey-cli hotkeys getHOTKEYS GET返回最近一个已完成窗口内最热的 key按估算 QPS 降序排列复杂度为 O(N)N 为历史中的热 key 数量。每个条目是三个字段组成的 map字段定义见 src/commands/hotkeys-get.jsonkeykey 名称stringdbkey 被访问时所在的数据库 idintegerqps该 key 在最近完成窗口内的每秒访问估算值integer。文档示例数值仅为格式示意不是固定预期1) 1) key 2) hot_read_key 3) db 4) (integer) 0 5) qps 6) (integer) 21500 2) 1) key 2) hot_write_key 3) db 4) (integer) 0 5) qps 6) (integer) 12000两个直接影响使用方式的行为报告的是已完成窗口不是当前窗口。制造流量后窗口尚未冻结时结果可能为空需要轮询几次HOTKEYS GET直到结果非空这正是单元测试 tests/unit/hotkeys.tcl 验证“通过重复访问生成热点 key”的方式先hotkeys reset对目标 key 做数百次GET/SET然后轮询hotkeys get直到非空。读和写共用同一条目同一个 key 只会出现一次不按访问类型拆分。检测关闭时返回空数组而不是报错与SLOWLOG GET行为一致轮询方无需匹配错误字符串来区分“未启用”和“没有热点”。此外如果服务器停顿到未完成窗口覆盖的时间超过hotkeys-window-seconds的两倍该窗口的计数会被丢弃避免把长期平均当成单窗口报告HOTKEYS GET在下一个窗口完成前返回空结果。判断报告可信度INFO hotkeysINFO hotkeys提供两个字段帮助判断HOTKEYS GET的结果能信到什么程度valkey-cli info hotkeyshotkeys_last_window_samples最近完成窗口内的采样观测数 N。Space-Saving 的保证是相对于 N 表述的——只有频率高于 N/K 的 key 才被保证跟踪。用它评估检测下限N 很小时排名靠后的条目可信度有限。hotkeys_last_window_duration_ms最近完成窗口的实际跨度。窗口由服务器周期任务关闭因此实际跨度比配置值多一段很小的轮转延迟报告的 QPS 除以的是实测跨度而非配置长度这段延迟不会抬高数字。检测刚启用或刚RESET后还没有完成窗口该字段为 0此时HOTKEYS GET也是空结果。清理统计状态HOTKEYS RESET 与自动清理valkey-cli hotkeys resetHOTKEYS RESET清空所有热点统计与历史返回OK随后HOTKEYS GET返回空数组单元测试对这两个行为均有断言。除手动 RESET 外任何会丢弃整个数据库或 slot 范围的操作也会清空热点状态FLUSHDB、FLUSHALL、清空数据集的全量同步或 RDB 重载、cluster reset、丢弃 slot。而普通的 key 访问和删除会被当作更新计入DEL、UNLINK算作一次访问key 过期和逐出不会清空其状态。边界行为与限制以下行为来自 valkey.conf 的说明与 src/hotkeys.c 的实现注释观察结果前值得了解只统计真实客户端流量。记录只发生在客户端真正执行命令时复制链路、AOF、RDB/AOF 加载不计入管理性 slot 删除如CLUSTER FLUSHSLOT、slot 迁移也不会喂入或挤出采样器。导入流量是用户驱动的负载会被计入。内省型查找被跳过。带LOOKUP_NOHOTKEYS标记的查找OBJECT、DEBUG、cluster redirect 查找不算访问EXISTS、TYPE、TTL这类只带LOOKUP_NOTOUCH的客户端读取仍算真实访问。RENAME / MOVE / SWAPDB 不会重归因。条目按 (key 名, db) 跟踪这些命令之后旧条目立即停止累计、随窗口轮转消失所以HOTKEYS GET最多在hotkeys-window-seconds内报告旧名称或旧数据库。多种数据类型均被跟踪。单元测试覆盖了 string、hash、list、set、zset 上的访问。HOTKEYS属于 server 命令组GET与RESET子命令在 ACL 中归入ADMIN、DANGEROUS、SLOW类别使用受限 ACL 的客户端需要相应权限HOTKEYS HELP可列出全部子命令。配置项原文见 valkey.conf命令定义见 src/commands/hotkeys-get.json、src/commands/hotkeys-reset.json检测策略实现见 src/hotkeys.c完整的行为用例见 tests/unit/hotkeys.tcl。【免费下载链接】placeholderkvA flexible distributed key-value database that is optimized for caching and other realtime workloads.项目地址: https://gitcode.com/GitHub_Trending/pl/placeholderkv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价