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进行写操作。
有疑问加站长微信联系(非本文作者)