0

这是代码

 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,真正的sortedset计数100000。但是如果我使用c.Flush(),总也设置100000,真正的sortedset计数小于100000(96932);如果我使用time.Sleep() 在 main 函数的末尾,总数也是 100000。

当 main func 退出时,flush func 没有完成?为什么?谢谢你!

4

1 回答 1

1

在循环之后调用 Close() 时程序工作的原因是池连接的 Close() 方法读取并丢弃所有待处理的响应。

应用程序应该接收所有命令的响应,而不是让响应备份并消耗服务器上的内存。无需在循环中刷新。

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()

此外,应用程序应该检查和处理从发送、刷新和接收返回的错误。

于 2017-01-09T14:31:37.040 回答