Go conn.flush()不会将所有记录刷新到redis

Go conn.flush()不会将所有记录刷新到redis,go,redigo,Go,Redigo,这是密码 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)

这是密码

 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()
  ...
}
func main(){
...
池:=创建池(*redis\u服务器,*redis\u通行证)
延迟池。关闭()
c:=pool.Get()
var i int64
st:=tickSec()
对于i=0;i<*总计;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、 发送(“ZADD”,“应用程序a_5512”,分数,id)
如果i%10000==0{
c、 刷新()
Println(“当前同步到redis”,i)
}
}
//c、 刷新()
c、 关闭()
...
}
如果我使用c.Close(),则集合总数为100000,实际的sortedset计数为100000。 但是如果我使用c.Flush(),总数也设置为100000,实际的sortedset计数小于100000(96932);如果我在主函数的末尾使用time.Sleep(),那么总数也是100000


退出主功能时,刷新功能未完成?为什么?谢谢大家!

在循环后调用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()
go func(){
对于i=0;i<*总计;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、 发送(“ZADD”,“应用程序a_5512”,分数,id)
}
c、 刷新()
}
对于i=0;i<*总计;i++{
c、 接收()
}
c、 关闭()

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

Close()将放弃所有挂起的响应。但是刷新不会吗?我在循环中使用flush int,因为总数非常大,并且占用了大量内存。谢谢!Flush将数据写入网络。Flush不读取响应。池连接的Close方法尝试在将基础连接返回池之前将连接返回到“中立”状态。这包括刷新应用程序编写的任何命令,以及读取应用程序尚未读取的所有响应。连接使用缓冲区缓冲数据。写入程序使用固定大小的缓冲区。