go 中直接利用hset向redis存入数据效率较低,当要存入的数据已知时,可以利用hmset 来替换hset进行存储。
var args []interface{}{"myhash"} for key,value := range fvs { args = append(args, key, value) } _, err := conn.Do("HMSET", args...)
注:fvs为对应的key,value的map映射,将该映射关系存入到redis中名字为myhash的域中, args...表示args slice中的顺序的所有元素。
hmset存储速度相对hset已经很快,但是利用go中goroutine并发hmset能取得更好的存储效果吗?答案是否定的。
当利用多个(10个)goroutine进行并发hmset时,如
for i:=0;i<10;i++{
go func(){
......
_, err = conn.Do("hmset", args...)
if err != nil {
fmt.Println(err)
}
......
}
}
此时便会出现错误:use of closed network connection
错误原因:hmset对redis进行写操作时,只能对一个hash表有一个写操作,不能同时多个写操作。
解决办法:
在执行hmset命令之前加锁,执行完之后解锁即可。本例解决方案如下:
import "sync"
var l sync.Mutex
for i:=0;i<10;i++{
go func(){
......
l.Lock()
_, err = conn.Do("hmset", args...)
if err != nil {
fmt.Println(err)
}
l.Unlock()
......
}
}利用加锁方法变能够确保每次只有一个进行hmset对redis进行写操作。