请教一个高并发下操作 redis 导致的 connection reset by peer 问题

weixin_38076612 2019-09-20 10:13:56
我的程序如下,目的就是为了测试,高并发下读取 redis 会出现什么问题

```
package main

import (
"fmt"
"time"

"github.com/garyburd/redigo/redis"
)

var pool *redis.Pool

type User struct {
ID int `json:"id"`
Name string `json:"name"`
Password string `json:"password"`
}

func init() {
pool = &redis.Pool{
// 初始化链接数量
MaxIdle: 16,
MaxActive: 0,
IdleTimeout: 300 * time.Second,
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "127.0.0.1:6379")
},
}
}

func idIncr(conn redis.Conn) (id int, err error) {
res, err := conn.Do("incr", "users_id_for_test")
if err != nil {
fmt.Printf("id incr error: %v\n", err)
return
}
id = int(res.(int64))
fmt.Printf("id: %v\n", id)
return
}

func Register() (err error) {
conn := pool.Get()
defer conn.Close()

// id 自增 1,作为下个用户 id
id, err := idIncr(conn)
if err != nil {
return
}

_, err = conn.Do("rpush", "usersList", id)
if err != nil {
fmt.Printf("set user to reids error: %v", err)
return
}
return
}

// 测试高并发下操作redis
func main() {
for i := 0; i < 1000; i++ {
go Register()
}
time.Sleep(10 * time.Second)
}
````

运行程序后有如下报错:
```
....
id incr error: read tcp 127.0.0.1:59699->127.0.0.1:6379: read: connection reset by peer
id incr error: read tcp 127.0.0.1:59701->127.0.0.1:6379: read: connection reset by peer
id incr error: read tcp 127.0.0.1:59740->127.0.0.1:6379: read: connection reset by peer
....
```

多次测试,发现每次有 300 左右的记录能够插入成功。应该是高并发下,可用 redis 连接数不够导致的问题,有没有了解细节的大佬,能给个完整的讲解?
...全文
1408 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38097166 2019-09-20
  • 打赏
  • 举报
回复
MaxIdle: 16, MaxActive: 0, 自己看下redis pool的配置说明…………
weixin_38101849 2019-09-20
  • 打赏
  • 举报
回复
这个要和你redis配置相匹配。 连接池主要解决两个问题,1是防止客户端打开的请求数量超过服务器端,2是避免重复新建和关闭的消耗。 实际上,合适的链接池的效率也比一股脑儿把请求全发过去的效率要高。 而且你已经用了这个包的pool了,为啥不用pool功能……

473

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧