gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:14:18 25 4
gpt4 key购买 nike

这是代码

 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 返回的错误。

关于go - conn.flush() 不会将所有记录刷新到 redis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41543210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com