英文:
conn.flush() will not flush all record to redis
问题
这是代码:
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,实际的有序集合数量少于100000(96932);如果我在main函数的末尾使用time.Sleep(),总共也是100000。
当main函数退出时,flush函数没有完成吗?为什么?谢谢!
<details>
<summary>英文:</summary>
this is code
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()
...
}
if i use c.Close(),the total set 100000,the real sortedset count 100000.
but if i use c.Flush(),the total also set 100000, the real sortedset count less than 100000(96932);if i use time.Sleep() in the end of the main func,the total is 100000 too.
when main func exit,the flush func is not complete?and why? thank you!
</details>
# 答案1
**得分**: 1
程序在循环之后调用Close()时能够正常工作的原因是,连接池的Close()方法会读取并丢弃所有待处理的响应。
应用程序应该接收所有命令的响应,而不是让响应积压并消耗服务器上的内存。在循环中没有必要刷新。
```go
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返回的错误。
英文:
The reason that the program works when Close() is called after the loop is that the pooled connection's Close() method reads and discards all pending responses.
The application should Receive the responses for all commands instead of letting the respones backup and consume memory on the server. There's no need to flush in the loop.
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()
Also, the application should check and handle the errors returns from Send, Flush and Receive.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论