猿问

Redis 在 docker 容器中失去连接

我正在使用 redigo 创建 PubSub,并且连接是由 redis 池创建的。


这是 Redis 池代码:


package main


import (

    "os"

    "os/signal"

    "syscall"

    "time"


    "github.com/gomodule/redigo/redis"

)


type IRedis interface {

    Addr() string

    Conn() redis.Conn

    Set(key string, body string) error

    Close()

}


type Redis struct {

    addr string

    pool *redis.Pool

}


func NewRedis(addr string) *Redis {

    r := &Redis{

        addr,

        &redis.Pool{

            MaxIdle:     50000,

            IdleTimeout: 240 * time.Second,

            Dial: func() (redis.Conn, error) {

                c, err := redis.Dial("tcp", addr)

                if err != nil {

                    return nil, err

                }

                return c, err

            },

            TestOnBorrow: func(c redis.Conn, t time.Time) error {

                _, err := c.Do("PING")

                return err

            },

        },

    }


    r.cleanupHook()

    return r

}


func (r *Redis) cleanupHook() {

    c := make(chan os.Signal, 1)

    signal.Notify(c, os.Interrupt)

    signal.Notify(c, syscall.SIGTERM)

    signal.Notify(c, syscall.SIGKILL)

    go func() {

        <-c

        r.pool.Close()

        os.Exit(0)

    }()

}


func (r *Redis) Addr() string {

    return r.addr

}


func (r *Redis) Conn() redis.Conn {

    return r.pool.Get()

}


func (r *Redis) Set(key string, body string) error {

    p := r.pool.Get()

    defer p.Close()


    _, err := p.Do("SET", key, body)

    return err

}


func (r *Redis) Close() {

    r.pool.Close()

}


DIEA
浏览 140回答 1
1回答

慕尼黑8549860

问题出在 redis conf 中名为 client-output-buffer-limit pubsub 的参数,默认值为 32mb 8mb 60,当达到限制时,redis 会关闭与 pubsub 的连接。为了解决它,我增加了价值。
随时随地看视频慕课网APP

相关分类

Go
我要回答