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方法尝试在将基础连接返回池之前将连接返回到“中立”状态。这包括刷新应用程序编写的任何命令,以及读取应用程序尚未读取的所有响应。连接使用缓冲区缓冲数据。写入程序使用固定大小的缓冲区。