英文:
Go-Redis HMSet with string fields gives WRONGTYPE Operation
问题
我正在尝试使用HMSET来设置一个包含两个字符串字段(id
和content
)的新hash
。
我可以很容易地通过redis-cli
来实现这一点,使用SET i 0
来初始化一个计数器用于ids,然后使用HMSET test id hey content herro
创建一个新的hash,并使用HMGET test id content
获取这两个字段,结果是1) hey 2) herro
。
不幸的是,我无法通过Go-Redis以及特别是HMSet来实现这样的结果。
到目前为止,我尝试过以下代码:
var uid = "0"
err = c.Get("i").Err()
if(err != nil) {
//如果计数器未设置,则将其设置为0
err := c.Set("i", "0", 0).Err()
if(err != nil){
panic(err)
}
} else {
//否则,递增计数器
counter, err := c.Incr("i").Result()
//将其转换为字符串
uid = strconv.FormatInt(index, 10)
if(err != nil){
panic(err)
}
//设置新的计数器
err = c.Set("i", counter, 0).Err()
if( err!= nil ){
panic(err)
}
}
//初始化一个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 Operation against a key holding the wrong kind of value
我真的不明白为什么会出现这个错误,因为我在redis-cli
中以完全相同的方式使其工作。
HMSet
的定义为func (c *Client) HMSet(key string, fields map[string]interface{}) *StatusCmd
。
我无法找到任何使用Go-Redis的在线示例来说明这种用法。
我做错了什么?
英文:
I'm trying to use HMSET to set a new hash
containing two string fields, id
and content
.
I'm able to make this via redis-cli
pretty easily using SET i 0
to initialize a counter for ids, then creating a new hash using HMSET test id hey content herro
and getting both of these fields with HMGET test id content
resulting in 1) hey 2) herro
.
Unfortunately I'm not able to achieve such result with Go-Redis and in particular with HMSet.
So far I tried
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)
Everything works fine but c.HMSet("i", m).Result()
. I get:
> WRONGTYPE Operation against a key holding the wrong kind of value
And I cannot really get why since I managed to make it work on the very same way in redis-cli
.
HMSet
is defined as func (c *Client) HMSet(key string, fields map[string]interface{}) *StatusCmd
.
I wasn't able to find any example online using Go-Redis illustrating this use case.
What Am I doing Wrong?
答案1
得分: 3
你正在两次访问相同的键"i"
- 一次是在调用SET时作为字符串,然后在调用HMSET时作为哈希。你得到的错误只是Redis拒绝在字符串上执行HMSET操作,这是无效的操作。
顺便说一句,反过来是可以的 - 在Redis中对任何类型调用SET只会写入一个字符串,而不是该值,所以要小心。
英文:
You are accessing the same key "i"
twice - once as a string when calling SET, and then as a hash when calling HMSET.
The error you are getting is just redis denying HMSET on a string, which is an invalid operation.
BTW the other way around will work - calling SET on any type in redis will just write a string instead of that value, so be careful.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论