这是代码
func main() {
...
pool := createPool(*redis_server, *redis_pass)
defer pool.Close()
c := pool.Get()
var i int64
st := tickSec()
for i = 0; i < *total; i++ {
r := time.Now().Unix() - rand.Int63n(60*60*24*31*12)
score, _ := strconv.Atoi(time.Unix(r, 0).Format("2006010215"))
id := utee.PlainMd5(uuid.NewUUID().String())
c.Send("ZADD", "app_a_5512", score, id)
if i%10000 == 0 {
c.Flush()
log.Println("current sync to redis", i)
}
}
//c.Flush()
c.Close()
...
}
如果我使用c.Close(),总设置为100000,实际排序集数为100000。 但如果我使用c.Flush(),总数也设置为100000,实际的排序集数小于100000(96932);如果我在主函数的末尾使用time.Sleep(),则总数也是100000。 / p>
当main func退出时,flush func不完整?为什么?谢谢!
答案 0 :(得分:1)
在循环之后调用Close()时程序工作的原因是池连接的Close()方法读取并丢弃所有挂起的响应。
应用程序应Receive响应所有命令,而不是让响应备份并消耗服务器上的内存。没有必要在循环中刷新。
go func() {
for i = 0; i < *total; i++ {
r := time.Now().Unix() - rand.Int63n(60*60*24*31*12)
score, _ := strconv.Atoi(time.Unix(r, 0).Format("2006010215"))
id := utee.PlainMd5(uuid.NewUUID().String())
c.Send("ZADD", "app_a_5512", score, id)
}
c.Flush()
}
for i = 0; i < *total; i++ {
c.Receive()
}
c.Close()
此外,应用程序应检查并处理发送,刷新和接收的错误返回。