
DiceDB 2024-12-19 更新解读ZSET 类型测试、SET 命令增强与许可证切换【免费下载链接】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-12-19 发布周期对应 docs/src/content/updates/2024-12-19.md围绕三大核心变化展开为有序集合zset数据类型补齐TYPE命令测试用例、改进SET命令实现、以及将项目许可证切换为 BSD 3-Clause。读者将了解这些变更背后的源码实现细节、可复现的测试用例以及配套的文档、清理与发布动作并能在本地仓库中逐一验证。一、更新概览本次发布周期改了什么2024-12-19.md是 DiceDB 官方更新日志系列见 docs/src/content/updates/中的一期按 New Features、Bug Fixes、Documentation 与 General Enhancements 四类组织。与前后相邻的周期如 2024-12-05.md 引入 Bloom Filter 与类型标准化相比本期以夯实基础能力为主没有新增对外命令而是集中做三件事测试补齐为 zset有序集合数据类型在TYPE命令中的表现新增测试用例PR #1366核心命令增强改进SET命令的实现PR #1371工程与发布动作切换 BSD 3-Clause 许可证、清理sql包与query_manager代码、更新文档与站点资产。下文将逐项展开并给出仓库内可直接对照的源码与测试路径。二、新特性zset 数据类型测试用例与 SET 命令改进2.1 为 zset 补齐TYPE命令测试用例PR #1366更新日志中本项变更由pankajjs提交PR #1366其目的是验证TYPE命令对有序集合数据类型的支持。要理解这条变更的价值需要先了解 DiceDB 的类型系统。在 DiceDB 中每个存储对象都带有类型标记定义在 internal/object/object.goconst ( ObjTypeString ObjectType iota _ // skip 1 and 2 to maintain compatibility _ ObjTypeJSON ObjTypeByteArray ObjTypeInt ObjTypeSet ObjTypeSSMap ObjTypeSortedSet ObjTypeCountMinSketch ObjTypeBF ObjTypeDequeue ObjTypeHLL ObjTypeFloat )其中ObjTypeSortedSet正是有序集合zset的类型标识其字符串名称为sortedset见同文件 internal/object/object.go 的String()方法。TYPE命令的实现位于 internal/cmd/cmd_type.go其核心逻辑如下obj : s.Get(key) if obj nil { return TYPEResNilRes, nil } return newTYPERes(obj.Type.String()), nil即键不存在时返回none存在时返回对象类型对应的字符串。因此一个键被ZADD写入后TYPE应当返回sortedset而此前测试并未覆盖这一路径——这正是 PR #1366 补上的测试点。与之对应仓库中的命令集成测试位于 tests/commands/ironhawk/type_test.go其用例覆盖了三类场景参数个数非法时报错、键不存在返回none、键存在且值为字符串时返回string。而 zset 相关命令ZADD、ZCARD、ZRANGE等的测试位于 tests/commands/ironhawk/其中 tests/commands/ironhawk/zadd_test.go 等文件即为 zset 数据类型的配套验证。可以推断PR #1366 是在type_test.go的既有模式上补充写入 zset 后执行TYPE应返回sortedset的用例从而保证类型系统在加入新数据类型后不被破坏。2.2 改进SET命令实现PR #1371第二项新特性由JyotinderSingh提交PR #1371改进了SET命令的实现。SET是 DiceDB 最核心的写入命令其元信息定义在 internal/cmd/cmd_set.go完整语法为SET key value [EX seconds | PX milliseconds] [EXAT timestamp | PXAT timestamp] [XX | NX] [KEEPTTL]支持的全部选项选项含义参数示例EX seconds以秒为单位设置过期时间SET k 43 EX 10PX milliseconds以毫秒为单位设置过期时间SET k 43 PX 10000EXAT timestamp以 Unix 秒级时间戳设置过期时刻SET k 43 EXAT 1772377267PXAT timestamp以 Unix 毫秒级时间戳设置过期时刻SET k 43 PXAT 1772377267000XX仅当键已存在时才写入SET k 43 XXNX仅当键不存在时才写入SET k 43 NXKEEPTTL保留键原有的 TTL忽略本次过期参数SET k 43 KEEPTTL参数解析与冲突校验SET的参数解析由parseParams完成internal/cmd/cmd_set.goEX/PX/EXAT/PXAT会消费后一个参数作为取值XX/NX/KEEPTTL/LT/GT/CH/INCR为布尔开关其余参数归入非参数列表若非参数列表非空则报ErrInvalidSyntax。实现中还做了严格的参数互斥校验internal/cmd/cmd_set.goEX与PX、EXAT与PXAT等过期参数两两互斥XX与NX互斥KEEPTTL与任何显式过期参数互斥违反即返回语法错误。这部分逻辑与集成测试中的用例一一对应见下文第 2.3 节。过期时间校验与类型推断过期时间解析时internal/cmd/cmd_set.go代码对取值做了边界检查EX/PX/EXAT/PXAT的解析结果必须大于 0 且小于MaxEXDurationSec定义为 365×24×60×60 秒即 1 年见 internal/cmd/cmd_set.go否则报ErrInvalidValue。EXAT/PXAT会先换算为相对当前时刻的剩余时长再校验。写入时SET会尝试对值做类型推断CreateObjectFromValueinternal/cmd/cmd_set.go先尝试解析为 int64成功则存为ObjTypeInt否则尝试 float64成功则存为ObjTypeFloat都失败则存为字符串ObjTypeString。这正是文档 docs/src/content/docs/commands/SET.md 中值以其原生类型存储描述的实现依据也让SET与TYPE、INCR等命令的类型感知行为保持一致。可以推断PR #1371 的改进方向即围绕上述解析、互斥校验与对象创建的健壮性展开。2.3 测试用例的完整验证清单SET命令的集成测试在 tests/commands/ironhawk/set_test.go 中非常完整涵盖基本写入与读取SET k v/GET k返回OK与v整数值123456789原样写读覆盖已有键过期语义EX 2与PX 2000在等待 3 秒后再次GET均返回空验证键已过期互斥报错SET k v EX 2 PX 2000返回invalid syntax for SET commandXX/NX 语义XX对不存在的键不写入、对已存在的键正常覆盖NX对不存在的键写入、对已存在的键保持原值不动PXAT 校验合法的毫秒时间戳写入成功过小的非法时间戳如123123返回invalid value for a parameter in SET command for PXAT parameterKEEPTTL先EX 2再KEEPTTL重写后 TTL 保留、键仍会过期EX/PX/EXAT与KEEPTTL混用均报语法错误参数个数裸SET报wrong number of arguments for SET command。上述用例通过runTestcases统一执行测试基建位于 tests/commands/ironhawk/setup.go与TYPE等命令的测试共用同一客户端连接模型。三、Bug 修复funding.json 与 OG 图片本期修复均为站点工程层面的小问题funding.json lint 修复PR #1381arpitbbhayani修正 docs/public/funding.json 中的格式问题使其通过 lint 检查。该文件用于声明项目资金来源与赞助方式随 DiceDB 站点静态资源一起发布OG 图片更新PR #1375arpitbbhayani更新站点的 Open Graph 分享图用于改善链接在社交平台分享时的展示效果。相关站点配置可查看 docs/astro.config.mjs 与 docs/src/layouts/Head.astro。四、文档更新社区与团队页、开源公告本期文档工作集中在站点内容层新增社区与团队板块PR #1370arpitbbhayani对应实现为 docs/src/pages/community/index.astro 与 docs/src/pages/team.astro团队成员数据存放在 docs/src/content/team/如arpit.json、jyotinder.json等发布DiceDB 现已开源博客PR #1373arpitbbhayani博文正文见 docs/src/content/blog/dicedb-is-open-source.md同步的博文编辑调整PR #1376用于保持内容一致性导航与站点统计PR #1379arpitbbhayani在导航栏加入 Playground 链接并更新统计数据导航组件实现在 docs/src/components/Nav.astro。这些变更表明本期更新不仅涉及核心引擎代码还包含围绕开源社区建设与站点体验的整体动作。五、工程清理移除 sql 包与 query_manager移除sql包与query_managerPR #1369apoorvyadav1111是本期的清理项。更新日志描述为移除sql包和watchmanager.go中的多余代码。从当前仓库结构看internal/sql目录已不存在而 watch 相关能力仍由独立的 internal/watchmanager/watch_manager.go 承担——该文件定义了Manager结构及其Run、listenForEvents、handleSubscription、handleUnsubscription、handleWatchEvent、notifyClients等核心方法负责管理WatchSubscription与CmdWatchEvent的流转。可以推断PR #1369 是将早期 SQL 查询相关的实验性代码sql包与query_manager从主代码库中彻底移除以避免维护负担watch 机制的职责随之收敛到watchmanager包中配合internal/cmd下的*_watch.go系列命令如 internal/cmd/cmd_get_watch.go、internal/cmd/cmd_zrange_watch.go继续工作。六、许可证切换为 BSD 3-Clause本期 General Enhancements 的首条即Switches license to BSD 3-Clause License对应仓库根目录的 LICENSE 文件其开头明确为BSD 3-Clause License Copyright (c) 2022-present, DiceDB contributorsBSD 3-Clause 属于宽松型开源许可证允许源码与二进制形式的重分发核心约束是保留版权声明、许可条件与免责声明详见 LICENSE 的条款 1–3。这一切换使项目采用更宽松的许可模式便于社区更自由地复用与分发代码。仓库内所有源文件头部均带有如下统一声明例如 internal/cmd/cmd_set.go// Copyright (c) 2022-present, DiceDB contributors // All rights reserved. Licensed under the BSD 3-Clause License. See LICENSE file in the project root for full license information.add_license_notice.sh脚本add_license_notice.sh即用于向各源文件批量添加上述许可头保证许可证切换后全仓库版权声明的一致性。七、在本地验证本次更新如需在本地复现本期的关键变更可按以下步骤操作# 1. 克隆仓库 git clone https://gitcode.com/GitHub_Trending/dic/dicedb.git cd dicedb # 2. 确认许可证为 BSD 3-Clause head -n 3 LICENSE # 3. 运行 SET 与 TYPE 命令的集成测试 go test ./tests/commands/ironhawk/ -run TestSET|TestTYPE -v # 4. 手动验证 SET 的类型推断与过期语义 # 启动服务器后通过任意 RESP 兼容客户端执行 # SET k 43 - OK存为 int # TYPE k - int # SET k2 v2 EX 2 - OK2 秒后 GET k2 返回空其中第 3 步直接对应本期新增/改进的测试用例tests/commands/ironhawk/set_test.go、tests/commands/ironhawk/type_test.go第 4 步可对照 internal/cmd/cmd_set.go 中CreateObjectFromValue的类型推断逻辑。八、小结综合来看DiceDB 2024-12-19 更新周期是一次典型的基础加固发布通过为 zset 补齐TYPE测试用例与改进SET命令实现来夯实核心读写路径的正确性通过清理sql包与query_manager精简代码库通过切换到 BSD 3-Clause 许可证、补充社区与团队页面、发布开源公告来推进项目开源生态。对开发者而言本期最有价值的参考是 internal/cmd/cmd_set.go 中参数互斥校验与类型推断的实现以及 tests/commands/ironhawk/set_test.go 中覆盖各种边界条件的完整测试清单——它们共同构成了 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),仅供参考