资讯动态

DiceDB 2024-10-03 版本更新解析:新命令、Eval 重构与多协议支持

发布时间:2026/9/16 0:14:22 来源:尧图企业网站定制
DiceDB 2024-10-03 版本更新解析新命令、Eval 重构与多协议支持【免费下载链接】dicedbOpen-source, low-latency key/value engine built on Valkey with query subscriptions and hierarchical storage tiers.项目地址: https://gitcode.com/GitHub_Trending/dic/dicedb本篇技术指南围绕 DiceDB 2024-10-03 的版本更新记录展开系统性梳理该版本新增的 11 个命令、5 项核心改进、3 个 Bug 修复以及测试与文档建设成果并结合仓库源码逐一验证其实现细节。读完本文你将掌握 DUMP/JSON.RESP/ZADD 等新命令的语法与底层序列化机制、Eval 多协议重构的架构脉络以及该版本在哈希、有序集合、JSON 等数据类型上的完整能力边界。版本概览2024-10-03 是 DiceDB 社区贡献非常密集的一个版本。从更新记录看该版本的核心脉络可以概括为三条主线命令面扩充一口气新增了 11 个命令覆盖字符串APPEND、哈希HKEYS、HEXISTS、HINCRBY、HINCRBYFLOAT、HVALS、HRANDFIELD、有序集合ZADD、ZRANGE、JSONJSON.RESP、JSON.ARRTRIM以及序列化DUMP等多个数据类型引擎层重构完成 Table 抽象、Eval 重构与多架构构建支持为后续多协议、多线程能力打下基础质量与协议建设新增 HTTP/WebSocket 集成测试、文档一致性改进并修复了 BITPOS、TYPE、BGREWRITEAOF 等已知问题。值得说明的是更新记录末尾还附带了项目负责人 Arpit 关于 Playground、配置命名、错误规范、日志库统一等内部讨论点这些讨论直接影响了后续版本中REQUEST_LIMIT、REQUEST_WINDOW、/shell/exec、slog等命名与架构决策是理解 DiceDB 演进方向的重要线索。新增命令详解以下所有命令均已在仓库 internal/eval/commands.go 的DiceCmds注册表中完成注册并在 internal/eval/store_eval.go 中有对应的 eval 实现。字符串命令APPEND贡献者Aditya-BhaleraoAPPEND用于在 key 的现有字符串值末尾追加内容。如果 key 不存在则等效于先创建该 key 再设置值如果 key 已存在但值不是字符串类型则返回类型错误。其核心逻辑在evalAPPEND中实现返回值是追加操作完成后字符串的新长度。哈希命令该版本一次性补齐了哈希数据类型的常用操作实现均位于internal/eval/store_eval.go类型校验统一依赖 internal/object/object.go 中的对象类型断言HKEYSswarajrb7返回哈希中所有字段field的名称列表对应evalHKEYSHEXISTSc-harish检查哈希中指定字段是否存在返回 1 或 0对应evalHEXISTSHINCRBYankkyprasad对哈希中指定字段的整数值进行增量运算支持负数递减字段不存在时按 0 起算对应evalHINCRBYHINCRBYFLOATayushsatyam146对哈希字段执行浮点增量运算比 HINCRBY 精度更宽对应evalHINCRBYFLOATHVALSbijuli74返回哈希中所有字段的值列表对应evalHVALSHRANDFIELDIndranil0603随机返回哈希中的一个或多个字段对应evalHRANDFIELD。从源码结构看这些哈希命令与现有 HLEN、HSET、HGET 等命令共同构成了 DiceDB 对哈希类型的完整支持面测试用例覆盖可参见 internal/eval/hmap_test.go。有序集合命令ZADD与ZRANGEJyotinder SinghZADD 用于向有序集合添加一个或多个成员及其分数ZRANGE 则按分数区间或排名区间返回成员。二者的底层数据结构是 internal/eval/sortedset/sorted_set.go 中的跳表实现支持WITHSCORES等常见参数。该版本同时期在_skipped_commands目录中保留了对应的文档模板见 docs/src/_skipped_commands/ZADD.md、docs/src/_skipped_commands/ZRANGE.md可作为语法参考。JSON 命令JSON.RESPprateek.singh.rathore以 Redis RESP 协议格式返回 JSON 值将 JSON 树扁平化为 RESP 数组结构对应evalJSONRESPJSON.ARRTRIMjujiale裁剪 JSON 数组中指定索引区间之外的元素区间边界与索引语义与 RedisJSON 保持一致对应evalJSONARRTRIM。这两个命令与仓库中已有的 JSON.SET、JSON.GET、JSON.ARRAPPEND 等共同组成 JSON 模块相关实现集中在internal/eval/store_eval.go的 JSON 操作区段。序列化命令DUMPTheRanomialDUMP 将 key 当前存储的值序列化为二进制格式并返回Base64 编码与 RESTORE 命令成对使用用于跨实例迁移数据。其实现位于 internal/eval/dump_restore.gordbSerialize负责序列化以0x09作为头部标识随后写入对象类型字节再按类型写入具体值最后以0xFF作为结束标记序列化内容附加 CRC64ECMA 表校验和appendChecksum保证传输过程中的数据完整性rdbDeserialize支持反序列化包括字符串、整数、集合、JSON、字节数组、Deque、布隆过滤器、有序集合、Count-Min Sketch 在内的全部对象类型。evalDUMP的入口实现位于 internal/eval/store_eval.go当 key 不存在时返回 NIL序列化失败时返回错误。该命令是 DiceDB 内置对象编码体系见 internal/object/typeencoding.go在数据迁移场景下的直接应用。核心改进与重构Table 抽象与双 Map 支持Arpit Bhayani该版本将底层存储的 Map 实现抽象为统一的ITable接口定义在 internal/common/map.gotype ITable[K comparable, V any] interface { Put(key K, value V) Get(key K) (K, V) // 实际签名以源码为准 Delete(key K) Len() int All(func(k K, obj V) bool) }接口之上提供了两种实现RegMap基于sync.Map的并发安全实现带原子计数器见 internal/common/regmap.go与普通 Go map 实现。这种设计让 Store 可以在不同场景下按需切换底层数据结构internal/store/store.go 中Store结构体的store与expires字段即声明为common.ITable类型。Eval 重构多协议与多线程兼容Ashwin Kulkarni更新记录提到的 Eval Refactor 在源码中的落点集中在 internal/eval/execute.go新引入的Eval结构体携带isHTTPOperation、isWebSocketOperation、isPreprocessOperation三个标志位使同一个命令执行管线可以感知当前请求来自 RESP、HTTP 还是 WebSocket 协议同时DiceCmds注册表中为每个命令增加了IsMigrated标记与NewEval/StoreObjectEval两个入口采用旧实现兜底、新实现渐进迁移的策略if diceCmd.IsMigrated { if e.cmd.InternalObjs ! nil { return diceCmd.StoreObjectEval(e.cmd, e.store) } return diceCmd.NewEval(e.cmd.Args, e.store) } return EvalResponse{Result: diceCmd.Eval(e.cmd.Args, e.store), Error: nil}其中StoreObjectEval专门服务于需要跨分片传递对象的命令如 COPY、RENAME、PFMERGE这也与仓库中 internal/shard 与 internal/shardmanager 的分片架构形成呼应。跨架构构建支持swaingotnochill该版本使 DiceDB 能够在不同 CPU 架构上编译运行。从源码看这一目标通过平台相关文件的划分实现如 internal/iomultiplexer/epoll_linux.go 对应 Linux/epollinternal/iomultiplexer/kqueue_darwin.go 对应 macOS/kqueue配置文件层面也有 config/constants_linux.go 与 config/constants_darwin.go 的区分。WebSocket 支持prateek.singh.rathore该版本为 DiceDB 增加了 WebSocket 协议支持。从 internal/eval/eval.go 与 internal/eval/execute.go 中的isWebSocketOperation标志可以看出命令执行层已经为 WebSocket 请求预留了完整的状态通道同时该版本的集成测试也包含了对 SET/GET 的 WebSocket 用例协议能力介绍可参考 docs/src/content/docs/protocols/websockets.mdx。代码结构改进Jyotinder Singh更新记录提到优化了evalHVALS的代码结构使其与其他哈希命令的实现风格保持一致属于渐进式重构的一部分。Bug 修复BITPOSBhavya Jain修复了位查找命令在特定边界条件下的计算结果错误问题。BITPOS 的注册表项位于 internal/eval/commands.go位运算逻辑实现在 internal/eval/bitpos.goTYPE 命令返回编码apoorvyadav1111修复了 TYPE 命令返回值编码不一致的问题使其在不同协议下返回统一的类型字符串string、hash、sortedset、json 等BGREWRITEAOF 子进程KaviiSuri修复了 macOS 上BGREWRITEAOF后台重写 AOF 时子进程无法正常工作的问题。AOF 相关逻辑位于 internal/store/aof.go。测试与文档建设该版本在质量保障方面投入明显HTTP 集成测试新增 KEYS、MGET、MSET、JSON 等命令的 HTTP 协议集成测试Shubh1815以及由 Karan Dixit、HARSH VARDHAN SINGH、apoorvyadav1111 补充的其他命令 HTTP 测试。测试骨架可参考 tests/commands/ironhawk/setup.go它通过dicedb-go客户端连接本地实例完成端到端验证WebSocket 集成测试为 SET、GET 命令新增 WebSocket 场景测试文档改进多个贡献者对命令文档进行了更新与一致性修正。仓库中的命令文档位于 docs/src/content/docs/commands如 ZADD、ZRANGE、HGETALL 等并配有生成文档的脚本见 scripts/generate-docs与文档测试scripts/test-docs从工具链层面保证文档与命令实现不脱节。基础设施与配置变更keystat 本地化soumya-codes将 key 计数统计收敛到 Store 实例内部。当前实现中Store通过GetKeyCount/IncrementKeyCount维护本地计数见 internal/store/store.go避免了跨分片共享计数带来的同步开销最大 TCP 连接数控制Ayush Saluja新增对最大客户端连接数的校验。配置项MaxClients位于 config/config.go默认值 20000由 iomultiplexer 层在初始化时校验非法值返回ErrInvalidMaxClients并在 internal/server/ironhawk/iothread_manager.go 中通过ErrMaxClientsReached拒绝超额连接README 与版本更新Arpit Bhayani、Dhroov GuptaREADME 多轮改进并完成版本号打补丁。内部讨论与后续演进方向更新记录末尾的 Discussion 部分记录了项目负责人 Arpit 提出的架构与工程化议题这些讨论虽然没有在本版本落地但揭示了 DiceDB 的治理思路主要包括命名规范化统一使用 DiceDB 而非 Dice配置项REQUEST_LIMIT建议改为REQUEST_LIMIT_PER_MIN、REQUEST_WINDOW建议改为REQUEST_WINDOW_SEC端点从/cli改为/shell/execblacklist 统一为 blocklist错误与日志规范所有错误信息统一小写errorResponse应直接做 JSON 序列化而非字符串拼接统一使用slog替代混用的log与slogPlayground 架构用.env文件承载PLAYGROUND_MONO_URL替代命名不佳的CLI_COMMAND_URLPlayground Web 应以静态站点形式发布而非依赖服务器进程并删除无意义的Dockerfile_Backend文件SDK 与命令分发质疑db包作为 DiceDB 命令薄包装层的价值提出由 SDK 暴露通用command执行接口使前后端新增命令时只需改动单侧代码。这些讨论点在后来的版本中逐步落实也解释了当前仓库中 cmd 目录、MaxClients配置项与slog日志体系internal/logger等现状的由来。如何验证本版本能力若要亲手验证上述命令可先构建并启动 DiceDBgo run main.go随后通过 RESP 客户端或dicedb-goSDK 依次尝试# 字符串与哈希 APPEND mykey hello HKEYS myhash HEXISTS myhash field1 HINCRBY myhash counter 5 HINCRBYFLOAT myhash ratio 1.5 HVALS myhash HRANDFIELD myhash # 有序集合 ZADD leaderboard 100 alice 200 bob ZRANGE leaderboard 0 -1 WITHSCORES # JSON JSON.SET doc $ {a: [1, 2, 3, 4]} JSON.ARRTRIM doc $ 1 2 JSON.RESP doc # 序列化 DUMP mykey对应命令的集成测试可参考 tests/commands/ironhawk 下的各测试文件如zadd_test.go、set_test.go它们是理解命令行为边界的权威参考。小结2024-10-03 版本是 DiceDB 在命令覆盖度与引擎架构上双线并进的一个缩影一方面通过社区贡献快速补齐字符串、哈希、有序集合、JSON 的核心命令另一方面通过 Table 抽象、Eval 重构、WebSocket 支持为多协议、多线程和分片架构铺路。对于想要理解 DiceDB 演进脉络或在其上做二次开发的工程师这份更新记录结合上述源码路径是性价比很高的入门材料。【免费下载链接】dicedbOpen-source, low-latency key/value engine built on Valkey with query subscriptions and hierarchical storage tiers.项目地址: https://gitcode.com/GitHub_Trending/dic/dicedb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价