这是代码

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

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

请您参考如下方法:

程序在循环后调用 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() 

此外,应用程序应检查并处理从 Send、Flush 和 Receive 返回的错误。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!