Redis在Docker容器中失去连接

I am making a PubSub using redigo and the connection is created by redis pool.

This is the Redis Pool code:

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()
}

This is my PubSub code:

package main

import (
    "log"

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

type PubSub struct {
    send chan string
    conn *redis.PubSubConn
}

func NewPubSub(s chan string, c *redis.PubSubConn) (*PubSub, error) {
    err := c.Subscribe("urls")
    if err != nil {
        return nil, err
    }

    return &PubSub{s, c}, nil
}

func (ps *PubSub) Start() {
    for {
        switch v := ps.conn.Receive().(type) {
        case redis.Message:
            data := string(v.Data)
            ps.send <- data

        case redis.Subscription:
            log.Printf("subscription message: %s: %s %d
", v.Channel, v.Kind, v.Count)

        case error:
            log.Println("error:", v)
            return
        }
    }
}

func (ps *PubSub) Close() {
    ps.conn.Close()
}

and after I receive 10k messages in my PubSub channel the connection is lost and I receive an redis.Error with the message EOF

Any thoughts why this is happen? Even when I run locally the problem happens

doucandiao9180
doucandiao9180 仅供参考,问题也发生在本地
一年多之前 回复
dtxb75622
dtxb75622 我已经创建了PubSub抽象,并且conn拥有与Redis的连接。这就是为什么ps.conn.Receive()
一年多之前 回复
dongyi1441
dongyi1441 如果您要包含完整的代码以进行复制(并且还可以减少对互联网的垃圾邮件-无需到处都公开问题),那将真的很有帮助。也就是说,当文档明确声明ps.Receive()时,为什么还要执行ps.conn.Receive()?
一年多之前 回复
dsds33222
dsds33222 是的,您理解正确。我的意思是redis发送带有消息EOF的redis.error,我失去了与它的连接。就像当前的连接已关闭,我再也无法收到消息了。该程序不会惊慌
一年多之前 回复
dongshou1991
dongshou1991 这是一个redis.Error消息EOF且都在docker中运行。此外,我已经测试过仅在本地和本地运行docker和client中的redis,但是会抛出相同的错误。
一年多之前 回复
douzongluo7542
douzongluo7542 见上面的评论
一年多之前 回复
dqjfw40446
dqjfw40446 日志什么也没有显示,如果我在本地运行该应用程序,它会很吸引人。有什么想法为什么不适用于docker?Redis图像为redis:alpine
一年多之前 回复

1个回答



问题在于redis conf中的参数名为client-output-buffer-limit pubsub,其默认值为32mb 8mb 60,当 达到限制redis关闭与pubsub的连接。
为解决这个问题,我增加了该值。</ p>
</ div>

展开原文

原文

The problem was with parameter in redis conf called client-output-buffer-limit pubsub which the default value is 32mb 8mb 60 and when the limit is reached redis closes the connection with the pubsub. To solve it I've increased the value.

douzi8548
douzi8548 可以这样标记自己的答案是绝对好的;)
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐