文章摘要
作者暂停了HNSW算法的开发工作,准备分享一年来在实现高效HNSW数据结构方面的经验。重点是如何优化HNSW以适配Redis低延迟、高性能的特性,而非基础介绍。文章将分章节详细讨论这些进阶发现。
文章总结
标题:HNSW算法的规模化实践 -
核心内容概述:
作者antirez在Redis中实现了HNSW(分层可导航小世界图)算法作为新的数据结构类型,并分享了在优化过程中的关键发现。文章主要围绕以下几个技术要点展开:
HNSW的现状与改进空间
- 原始论文存在未明确的细节(如节点删除机制)
- 质疑层级结构("H")的必要性,提出可能用单层结构替代
- 建议研究者探索HNSW的演进方向,而非仅关注磁盘化改造
内存优化方案
- 采用8位向量量化技术(默认方案),实现4倍空间节省和速度提升
- 保留全精度向量和二进制量化选项以满足特殊需求
- 量化算法细节:基于最大绝对值缩放至[-127,127]范围
性能提升策略
- 实现全线程化读写(包括写入操作的部分线程化)
- 独创的"epoch"标记法替代传统哈希表记录访问状态
- 写入操作分解为读阶段和提交阶段以减少锁竞争
内存回收机制
- 强制双向链接保证节点删除时可完全回收内存
- 开发邻居节点重连接算法,维护图结构完整性
- 实测可删除95%节点后仍保持良好查询精度
分布式扩展方案
- 将HNSW作为基础数据结构而非索引暴露给用户
- 支持跨多个Redis实例的客户端结果合并
- 通过键分片实现写入操作的并行化
加载优化与安全
- 序列化完整图结构实现100倍加载加速
- 设计防篡改校验机制(基于哈希的互反链接验证)
扩展功能
- 支持JSON元数据过滤查询
- 在贪婪搜索中集成属性过滤条件
内存效率评估
- 300万Word2Vec条目仅占用3GB内存(默认8位量化)
- 在MacBook上实测达48k查询/秒的吞吐量
实现价值: - 将HNSW实现为Redis原生数据结构,支持VADD/VREM/VSIM等操作 - 强调"程序员足够聪明"的设计哲学,提供底层控制灵活性 - 完整代码已开源,包含详细注释
结论: HNSW作为内存友好的近似最近邻搜索方案,配合适当的优化手段,能够满足大多数实际应用场景的需求。作者期待看到更多关于HNSW算法的改进研究。
(注:原文中关于个人开发过程、MacOS数据丢失经历等非技术细节已酌情删减)
评论总结
以下是评论内容的总结:
- 关于图结构在高规模场景的局限性(评论1)
- 主要观点:图结构在大规模场景下使用较少,存在构建复杂、缓存不友好等问题,且难以处理过滤查询
- 关键引用: "Graphs can be complex to build and rebalance...aren't that cache friendly" "Filtered HNSW isn't straightforward...keep traversing the graph looking for results"
- 关于HNSW算法的背景与局限(评论1,4)
- 主要观点:HNSW算法源于基准测试环境,未充分考虑实际应用中的过滤需求;高维数据下传统树结构效果不佳
- 关键引用: "HNSW came out of a benchmark regime...doesn't take into account the filtering" "For high-dimensional data...k-d tree and R-tree do not perform well enough"
- 关于系统设计的复杂性(评论3)
- 主要观点:简单透明的系统设计有利有弊,需要考虑不同水平程序员的需求
- 关键引用: "many programmers are smart...they can build more things" "many programmers are not smart...have to contribute too"
- 其他补充信息(评论2,5)
- Redis的HNSW实现采用多线程设计(评论2)
- 有用户对MacOS相关故事表示兴趣(评论5)
总结呈现了技术讨论(图结构/HNSW算法)、系统设计哲学和补充信息三个维度,保留了不同观点的代表性陈述。