带字符串字段的Go-Redis HMSet提供WRONGTYPE操作

时间:2017-05-02 20:40:10

标签: go hash redis

我尝试使用HMSET设置包含两个字符串字段hashid的新content

我能够通过redis-cli轻松地使用SET i 0初始化ID的计数器,然后使用HMSET test id hey content herro创建新的哈希并获取这两个字段HMGET test id content导致1) hey 2) herro

很遗憾,我无法使用Go-Redis,特别是HMSet来达到这样的效果。

到目前为止,我试过

var uid = "0"
err = c.Get("i").Err()
if(err != nil) {
    //If the counter is not set, set it to 0
    err := c.Set("i", "0", 0).Err()
    if(err != nil){
        panic(err)
    }
} else {
    //Else, increment it
    counter, err := c.Incr("i").Result()
    //Cast it to string
    uid = strconv.FormatInt(index, 10)
    if(err != nil){
        panic(err)
    }
    //Set new counter
    err = c.Set("i", counter, 0).Err()
    if( err!= nil ){
        panic(err)
    }
}

//Init a map[string]interface{}
var m = make(map[string]interface{})
m["id"] = uid
m["content"] = "herro"

hash, err := c.HMSet("i", m).Result()
if(err != nil){
    panic(err)
}

fmt.Println(hash)

一切正常但c.HMSet("i", m).Result()。我明白了:

  

WRONGTYPE对持有错误值的键的操作

我无法理解为什么因为我设法在redis-cli中以同样的方式使其工作。

HMSet定义为func (c *Client) HMSet(key string, fields map[string]interface{}) *StatusCmd

我无法使用Go-Redis在线找到任何示例来说明此用例。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

您正在访问相同的密钥"i"两次 - 在调用SET时作为字符串一次,然后在调用HMSET时作为哈希。

你得到的错误就是redis拒绝字符串上的HMSET,这是一个无效的操作。

顺便说一句,反过来会有效 - 在redis中调用任何类型的SET只会写一个字符串而不是那个值,所以要小心。