使用redigo调用HDEL返回0条删除记录,我的用法是否正确?
HDEL批量传入切片返回删除数为0的问题根因
问题核心原因
Redigo 原生 Do 方法不会自动展开切片类型的参数,而 Redis HDEL 命令要求删除的多个 field 必须作为独立的连续参数传入,两种写法的差异本质是参数传递格式不符合Redis命令规范。
两种写法的执行逻辑差异
- 无法执行的写法:直接传入
keysToDeleteArr切片时,Redigo会将整个切片作为单个参数序列化后发送给Redis,等效于执行命令HDEL myhash "[key1,key2,...]",Redis会把整个切片当成单个field名查找,找不到匹配字段自然返回删除数为0。 - 可正常执行的写法:循环中每次传入单个field,每个field都作为独立参数传递,匹配Redis命令格式,因此可以正常删除对应字段。
更高效的批量删除正确写法
不需要循环,通过Go的切片展开语法处理参数即可实现单次HDEL批量删除,减少Redis交互次数:
keysToDeleteArr []string // 上游传入的有效键值 s.transClient.Do("MULTI") // 先把myhash和切片元素拼接为interface切片,再展开传入Do方法 args := append([]interface{}{myhash}, keysToDeleteArr...) _, err := s.transClient.Do("HDEL", args...) s.transClient.Do("EXEC")
补充说明
你查阅的封装后的HDel方法内部已经做了参数展开的适配逻辑,所以支持直接传入切片,但是原生Do方法没有该处理,需要手动做参数转换。
内容的提问来源于stack exchange,提问作者Anup Puri
相关产品推荐
相关产品推荐

