ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SADD 命令详解:DiceDB 集合(Set)成员的添加与唯一性管理

SADD 命令详解:DiceDB 集合(Set)成员的添加与唯一性管理 SADD 命令详解DiceDB 集合Set成员的添加与唯一性管理【免费下载链接】dicedbOpen-source, low-latency key/value engine built on Valkey with query subscriptions and hierarchical storage tiers.项目地址: https://gitcode.com/GitHub_Trending/dic/dicedbDiceDB 是构建在 Valkey 之上的开源、低延迟键值引擎。SADD是 DiceDB 中面向集合Set类型的核心写入命令用于向集合添加一个或多个成员并在键不存在时自动创建新集合。本文以 SADD.md 为骨架结合仓库源码internal/eval/store_eval.go与测试用例internal/eval/eval_test.go、tests0/set_data_cmd_test.go系统讲解SADD的语法、参数、返回值、行为语义、错误处理与实战用法读完即可在 DiceDB 中正确、高效地使用集合管理唯一元素。SADD 是什么SADDSet ADD用于向 DiceDB 中的集合Set添加一个或多个成员。集合是无序、成员唯一的字符串集合天然适合去重 快速成员归属判断的场景。核心语义与命令注册元数据一致见 internal/eval/commands.go指定的成员若已存在于集合中将被忽略不报错键不存在时视为空集合SADD会自动创建集合并添加成员键存在但存储的值不是集合时返回类型错误。命令元数据中Arity: -3表示命令至少需要 3 个 token命令本身 key 至少一个 member即最少形如SADD key member。语法SADD key member [member ...]参数参数描述类型必填可多个key要添加成员的集合名称String是否member要添加到集合的一个或多个成员String是是keyDiceDB 中集合的标识符。若键不存在SADD会创建一个新集合若键存在但不是集合SADD返回错误。member要添加到集合的字符串值。可在单个SADD命令中指定一个或多个成员每个成员按唯一字符串处理。返回值条件返回值命令执行成功整数实际添加到集合的成员数量键存在但不是集合错误返回的整数表示实际新增到集合的成员数不包含已存在的元素若所有指定成员都已在集合中命令返回0。从源码看计数器只对此前不在集合中的成员自增见 internal/eval/store_eval.gofor _, arg : range args[1:] { if _, ok : set[arg]; !ok { set[arg] struct{}{} count } }行为语义键存在性检查键不存在DiceDB 创建一个新集合并添加指定成员键存在且是集合向已有集合添加新成员键存在但不是集合返回错误。源码实现中键不存在时会以map[string]struct{}为底层结构创建新对象并以object.ObjTypeSet类型写入存储见 internal/eval/store_eval.goif obj nil { value : make(map[string]struct{}, lengthOfItems) obj store.NewObj(value, exDurationMs, object.ObjTypeSet) store.Put(key, obj, dstore.WithKeepTTL(keepttl)) }ObjTypeSet是对象系统中定义的集合类型常量之一见 internal/object/object.goSADD依赖该类型标记做类型分派与断言。成员添加每个指定成员若不在集合中则被加入若成员已存在则被忽略且不产生错误成员指定顺序不影响集合因为集合本身无序。唯一性集合只存储唯一元素重复添加无效果唯一性基于字符串比较例如1与数字1字符串1视为同一成员字符串形式不同则视为不同成员。文档原意强调按字符串值比较即1与1在文本形式一致时视为同一成员。错误处理1. 参数数量错误错误类型参数不足至少需要 key 和一个 member触发场景调用SADD时参数数量不足源码位置internal/eval/store_eval.go通过diceerrors.ErrWrongArgumentCount(SADD)返回错误见 internal/errors/errors.go。2. 类型错误WRONGTYPE错误消息(error) WRONGTYPE Operation against a key holding the wrong kind of value触发场景对保存了非集合值如字符串、列表、哈希的键使用SADD源码位置通过object.AssertType(obj.Type, object.ObjTypeSet)断言失败后返回diceerrors.ErrWrongTypeOperation见 internal/eval/store_eval.go错误定义见 internal/errors/errors.go。这条错误保证了 DiceDB 操作的类型安全。示例用法以下示例默认连接到 DiceDB 本地默认端口7379。基础用法创建新集合127.0.0.1:7379 SADD fruits apple banana cherry (integer) 3说明创建一个名为fruits的新集合包含三个成员。命令返回3表示三个成员均成功添加。向已有集合添加成员127.0.0.1:7379 SADD fruits banana date elderberry (integer) 2说明向已有的fruits集合添加date和elderberry。banana因已存在而被忽略命令返回2表示新增了两个成员。添加重复成员127.0.0.1:7379 SADD fruits apple fig apple (integer) 1说明仅fig被添加。两处apple均因已存在而被忽略命令返回1。一次添加多个成员含重复127.0.0.1:7379 SADD vegetables carrot broccoli spinach carrot (integer) 3说明创建新集合vegetables并添加三个唯一成员。carrot只被添加一次命令返回3。错误场景错误类型127.0.0.1:7379 SET mykey value OK 127.0.0.1:7379 SADD mykey member1 (error) WRONGTYPE Operation against a key holding the wrong kind of value说明先将mykey设为字符串再对同一键执行SADD会失败因为mykey不是集合。参数不足127.0.0.1:7379 SADD onlykey (error) wrong number of arguments for sadd command说明缺少 member 参数命令被拒绝执行。查看集合内容SADD之外可使用SMEMBERS验证集合内容127.0.0.1:7379 SMEMBERS fruits 1) apple 2) banana 3) cherry 4) date 5) elderberry 6) fig源码实现要点evalSADD的完整执行流程internal/eval/store_eval.go参数校验len(args) 2时返回参数数量错误从存储中取出键对应的对象若对象不存在创建新的集合对象底层为map[string]struct{}并写入存储类型断言非ObjTypeSet则返回 WRONGTYPE 错误遍历成员仅将不存在的成员加入集合并计数返回实际新增数量。命令元数据将SADD注册进命令表DiceCmds[SADD]并声明KeySpecs{BeginIndex: 1}表示第一个参数为键见 internal/eval/commands.go 与 internal/eval/commands.go这与文档中key为第一参数的规定完全一致。测试验证仓库通过单元测试与集成测试双重验证SADD行为单元测试 internal/eval/eval_test.go 覆盖参数不足、新键新成员、新键多成员、已有键新成员、已有成员、新老成员混合、非集合类型等场景验证返回值与错误类型集成测试 tests0/set_data_cmd_test.go 覆盖SADD与SMEMBERS、SCARD、SREM的组合操作包括简单值、多值、重复值、错误键类型等用例。总结SADD是 DiceDB 集合类型的基础写入命令其存在即忽略、不存在即创建并添加的语义使其天然适合去重与集合构建场景。使用要点一个命令可添加多个成员返回值为实际新增数量对非集合键使用会返回 WRONGTYPE 错误结合SMEMBERS查看成员、SCARD集合基数、SREM移除成员可完成集合的完整管理。掌握SADD的行为与边界即可在 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),仅供参考
返回列表