[gogf/gf]协诚状态下使用redis抛错

2024-06-25 968 views
6
pool := grpool.New(100000)
    t := time.Now()
    g.Redis().SetMaxIdle(100)
    g.Redis().SetMaxActive(10000)
    fmt.Println(t.Format("2006-01-02 15:04:05"))
    conn := g.Redis().Conn()
    for i := 0; i < 1000000000; i++ {
        v := i
        pool.Add(func() {
       //随便写的命令
            _, err := conn.Do("SCARD", "Kuang:status_set")
            if err != nil {
                fmt.Println(v)
                panic(err)
            }
        })
    }
    tt := time.Now()
    fmt.Println(tt.Format("2006-01-02 15:04:05"))
        sigterm := make(chan os.Signal, 1)
    signal.Notify(sigterm, syscall.SIGINT, syscall.SIGTERM)
    <-sigterm

回答

6

image

2

补充一下,这个是我测试的代码,具体应用场景是开协诚,在协诚中可以复用一个连接,所有协诚完成之后关闭连接,sync没加不影响抛错,上来直接就抛错 短写

0

@zhangHongBo21 问题在于你将同一个链接对象复用,这样可能会造成一些不可预料的错误,其实Redis底层已经实现了连接池,你这样既可:

package main

import (
    "fmt"
    "github.com/gogf/gf/frame/g"
    "github.com/gogf/gf/os/grpool"
    "os"
    "os/signal"
    "syscall"
    "time"
)

func main() {
    pool := grpool.New(100000)
    t := time.Now()
    g.Redis().SetMaxIdle(100)
    g.Redis().SetMaxActive(10000)
    fmt.Println(t.Format("2006-01-02 15:04:05"))
    for i := 0; i < 100; i++ {
        v := i
        pool.Add(func() {
            //随便写的命令
            _, err := g.Redis().Do("SCARD", "Kuang:status_set")
            if err != nil {
                fmt.Println(v)
                panic(err)
            }
        })
    }
    tt := time.Now()
    fmt.Println(tt.Format("2006-01-02 15:04:05"))
    sigterm := make(chan os.Signal, 1)
    signal.Notify(sigterm, syscall.SIGINT, syscall.SIGTERM)
}
5

@zhangHongBo21 我试过了没有复现端口耗尽的问题,我用的是最新的v1.12.1版本。你试试?

8

@zhangHongBo21 我试过了没有复现端口耗尽的问题,我用的是最新的v1.12.1版本。你试试?

我知道大佬你为什么不会出现问题了,是因为循环次数的问题,端口号一台电脑有超过六万个,而我举的例子只有一百次,当然不会耗尽,而我本地的代码是循环超过十万次的,所以会端口耗尽

3

我看了大佬封装redis的源码,有一个疑问,在异步处理的情况,我有一个协诚在redis池中取了一个链接,拼装管道中的命令,然后另一个协诚使用正常的 g.Redis().Do()方法,会不会意外关闭我管道所用的链接 image

5

捎带着还有个错误不知道咋处理,redis 报错 short write

1

@zhangHongBo21 我回头把数量改大点再试试哈

7

@zhangHongBo21 你的MaxActive参数设置超过Redis允许的连接数限制了,你改成100试试。

3

@gqcn 啊哈,尴尬,忘了,redis默认是一万链接数,