跳表
· 阅读需 1 分钟
跳表本质上是一种链表,允许您在其上进行二分查找。它通过添加额外的节点来实现这一点,使您能够‘跳过’链表的某些部分。通过随机投掷硬币来创建额外节点,跳表的搜索、插入和删除操作的时间复杂度应为 O(logn)。
用例
- LevelDB MemTable
- Redis SortedSet
- Lucene 倒排索引
跳表本质上是一种链表,允许您在其上进行二分查找。它通过添加额外的节点来实现这一点,使您能够‘跳过’链表的某些部分。通过随机投掷硬币来创建额外节点,跳表的搜索、插入和删除操作的时间复杂度应为 O(logn)。
用例
总之,在选择公共 API、API 网关或 BFF(前端后端)网关的工具时,我更喜欢 GraphQL,因为它具有尾随结果、批处理嵌套查询、性能追踪和显式缓存等功能。
JSON RPC | GraphQL | REST | gRPC | |
---|---|---|---|---|
用例 | 以太坊 | Github V2、Airbnb、Facebook BFF / API 网关 | Swagger | 高性能、谷歌、内部端点 |
单一端点 | ✅ | ✅ | ❌ | ✅ |
类型系统 | ✅,与 JSON 一样弱 无 uint64 | ✅ 无 uint64 | ✅ w/ Swagger 无 uint64 | ✅ 有 uint64 |
定制结果 | ❌ | ✅ | ❌ | ❌ |
批处理嵌套查询 | ❌ | ✅ | ❌ | ❌ |
版本控制 | ❌ | 模式扩展 | 是,使用 v1/v2 路由 | protobuf 中的字段编号 |
错误处理 | 结构化 | 结构化 | HTTP 状态码 | 结构化 |
跨平台 | ✅ | ✅ | ✅ | ✅ |
游乐场 UI | ❌ | GraphQL Bin | Swagger | ❌ |
性能追踪 | ? | Apollo 插件 | ? | ? |
缓存 | 无或 HTTP 缓存控制 | Apollo 插件 | HTTP 缓存控制 | 尚未原生支持,但仍可使用 HTTP 缓存控制 |
问题 | 缺乏社区支持和工具链 Barrister IDL | 42.51 kb 客户端包大小 | 多个端点的非结构化,便携性差。 | Grpc-web 开发进行中,140kb JS 包。兼容性问题:并非所有地方都支持 HTTP2 和 grpc 依赖 |