我的程序如下,目的就是为了测试,高并发下读取 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:54156->127.0.0.1:6379: read: connection reset by peer
减少 goroutine 的数量不会有问题
应该是在高并发下 redis 的可用连接数不够了导致的问题,有理解的比较深入的大佬给个仔细的讲解吗?最好能给上解决方案,谢谢!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.