为了账号安全,请及时绑定邮箱和手机立即绑定

Redis 不会将 WRONGTYPE 作为事务中的错误返回

Redis 不会将 WRONGTYPE 作为事务中的错误返回

Go
摇曳的蔷薇 2022-07-18 17:02:37
首先,让我展示如何重现我的问题:在 docker 容器中运行 Redis连接到 Redis 并执行以下命令:> SET test 10在 Go 中,运行以下代码:func main() {    redisClient := getConnection() // Abstracting get connection for simplicity    r, err := redisClient.Do("HSET", "test", "f1", "v1", "f2", "v2")    fmt.Printf("%+v e: %+v\n")}很公平,在此步骤中显示以下错误(这意味着err != nil):WRONGTYPE Operation against a key holding the wrong kind of value e: WRONGTYPE Operation against a key holding the wrong kind of value相比之下,执行以下代码:func main() {    redisClient := getConnection()    redisClient.Send("MULTI")    redisClient.Send("HSET", "test", "f1", "v1", "f2", "v2")    r, err := redisClient.Do("EXEC")    fmt.Printf("%+v e: %+v\n")}正在打印的行是:WRONGTYPE Operation against a key holding the wrong kind of value e: <nil>这对我来说似乎不一致,因为我也希望在错误变量中MULTI返回。WRONGTYPE这是预期的行为还是我错过了什么?
查看完整描述

1 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

Redis 事务中的每个命令都有两个结果。一种是将命令添加到事务中的结果,另一种是在事务中执行命令的结果。


该Do方法返回将命令添加到事务的结果。


Redis EXEC命令返回一个数组,其中每个元素都是在事务中执行命令的结果。检查每个元素以检查单个命令错误:


values, err := redis.Values(redisClient.Do("EXEC"))

if err != nil {

    // Handle error

}

if err, ok := values[0].(redis.Error); ok {

    // Handle error for command 0.

    // Adjust the index to match the actual index of 

    // of the HMSET command in the transaction.

}

用于测试事务命令错误的辅助函数可能很有用:


func execValues(reply interface{}, err error) ([]interface{}, error) {

    if err != nil {

        return nil, err

    }

    values, ok := reply.([]interface{})

    if !ok {

        return nil, fmt.Errorf("unexpected type for EXEC reply, got type %T", reply)

    }

    for _, v := range values {

        if err, ok := v.(redis.Error); ok {

            return values, err

        }

    }

    return values, nil

}

像这样使用它:


values, err := execValues(redisClient.Do("EXEC"))

if err != nil {

    // Handle error.

}


查看完整回答
反对 回复 2022-07-18
  • 1 回答
  • 0 关注
  • 247 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号