开发者生态
morning
Prolly:基于 Prolly 树构建的内容寻址有序地图
2026-08-17
1 阅读
约7分钟阅读
forhappy
字号:
Prolly Prolly 发布了 prolly Rust 库箱。用户依赖于 prolly-map 包,而代码导入保持简洁:使用 prolly::{Config, Prolly}; 。该板条箱提供了内容寻址的 Prolly 树存储原语:基于字节键和字节值的不可变的、有序的键值索引,具有稳定的内容派生结构,用于高效的结构共享、差异、合并和批量加载。在 API 边界,树是一个小的持久句柄: root:Option 指向内容寻址的根节点。 config:Config记录了树使用的分块和编码参数。实际的节点位于可插入的 Store 中。操作仅克隆和重写受影响的路径或子树,写入新的内容寻址节点,并返回新的树句柄。所有存储支持的树工作均由运行时中立、异步优先的引擎实现一次。 AsyncProlly 直接使用它; Prolly 通过内联只读适配器驱动相同的完整操作。同步路径不会创建运行时、停放线程或将存储调用分派给 Tokio。架构对于喜欢光栅图像的上下文,相同的图表也呈现为diagram/prolly-tree-architecture@2x.png。完整的最终用户文档集位于 docs/ 中,其中包括入门材料、指南、菜谱、架构、设计规范、实施说明、路线图和语言移植指南。规范的食谱是 docs/cookbook.md 。本机近似最近邻索引记录在 docs/proximity-map.md 中。重大变更和发布资格记录在 CHANGELOG.md 中。交互式可视化器 3rd/prolly-tree-vismizer 中的浏览器应用程序针对此存储库的真实 @crabbuild/prolly-wasm 绑定执行突变,并呈现生成的内容寻址树、查找路径、结构差异和存储历史记录。对于想要在 prolly 树之上建立类似 Git 的存储库层的应用程序构建者,请参阅建议的 prolly-vcs 设计。它使 prolly-map 专注于不可变的有序映射,同时概述了一个单独的箱子,其中包含用于提交、引用、引用日志、补丁、合并编排、同步计划和存储库级 GC 的通用后端中立 KvStore 底层。这个箱子为您提供了什么按字典键顺序进行有序字节键查找。不可变更新: put 、 delete 和 batch 返回一个新的 Tree 。内容寻址节点:每个节点 CID 是确定性节点字节的 SHA-256 哈希值。使用 xxHash64 边界检查的确定性内容定义分块。版本之间的结构共享,因为未更改的节点保留相同的 CID。通过修剪相等的 CID 和不相交的子跨度来实现高效的差异和范围差异。具有冲突解决程序支持的三向合并。 CRDT 风格的无冲突合并策略。惰性范围迭代和基于游标的遍历。用于排序、分组、追加和多叶写入的批量突变路径。用于大型初始树的并行批量构建器。通过 Store 特征的可插拔存储,具有内存、SQLite 和可选的 RocksDB 实现。 Merkle 风格的缺失节点规划和复制助手用于存储同步。用于分支、标记、检查点和自定义根的快照命名空间帮助程序。事务安全的 VersionedMap 外观,具有自动头、不可变的内容派生版本、固定读取、证明、比较和合并、备份/同步、类型化编解码器、订阅、多映射事务、有界历史记录和范围 GC。严格的 IndexedMap 协调器,用于运行时定义的非唯一二级索引,具有单根原子发布、有限操作预算、稀疏和多值术语、KeysOnly / Include / All 投影、精确的历史快照、持久引脚、安全 GC、结构化诊断和经过验证的有界传输。应用程序通过 Prolly 或 AsyncProlly 上相同的 engine.indexed_map(...) 形状打开它;两条路径都使用相同的规范状态格式和严格的事务根发布。对 PostgreSQL、MySQL、Redis、Turso、DynamoDB、Cosmos DB 和 Spanner 提供一流的本机异步支持,并在阻塞应用程序需要时提供同步外观。树根的存储独立单密钥、共享多密钥、完整范围、光标页面和差异页面证明。用于检查形状、填充因子、扇出和序列化大小的树统计数据。硬切确定性邻近图,具有精确查找、过滤最佳优先搜索、本地化规范 COW、溢出/外部向量、SQ8/PQ/HNSW 加速、异步/SIMD 执行、类型化复制/GC 和描述符绑定证明。快速开始使用 prolly :: { Config , MemStore , Prolly } ;让 store = MemStore :: new ( ) ;让 prolly = Prolly :: new ( store , Config :: default ( ) ) ;让树=普利。创造 ( ) ;让树=普利。 put ( & tree , b"name" . to_vec ( ) , b"Alice" . to_vec ( ) ) 。展开 ( ) ;让值= prolly 。获取(&树,b“名称”)。展开 ( ) ;断言_eq! ( 值 , Some ( b"Alice" . to_vec ( ) ) ) ;让树=普利。德
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱