gpt4 book ai didi

go - 跨路由共享 Redis 设置

转载 作者:IT王子 更新时间:2023-10-29 01:36:34 24 4
gpt4 key购买 nike

我的 routes.go 文件中有很多路由,它们都调用我的 redis 数据库。我想知道如何避免在每条路由中调用 dialAUTH

我试过像这样在函数外设置变量:

var (
c, err = redis.Dial("tcp", ADDRESS)
_, err = c.Do("AUTH", "testing")
)

但是编译器不喜欢 err 被使用两次。

最佳答案

首先,仅使用 var 来声明变量。您不能在函数外运行代码,因此尝试在 var 语句内创建连接是没有用的。如果您需要在启动时运行某些东西,请使用 init()

redis 连接不能用于并发请求。如果你想跨多个路由共享一个redis连接,你需要有一个安全的方法来并发使用。在 github.com/garyburd/redigo/redis 的情况下,您想要使用 Pool。您可以在 Dial 函数中执行 AUTH 调用,每次都返回就绪连接。

var redisPool *redis.Pool

func init() {
redisPool = &redis.Pool{
MaxIdle: 3,
IdleTimeout: 240 * time.Second,
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", server)
if err != nil {
return nil, err
}
if _, err := c.Do("AUTH", password); err != nil {
c.Close()
return nil, err
}
return c, err
},
}
}

然后每次你需要一个连接时,你从池中获取一个,并在你完成后返回它。

conn := redisPool.Get()
// conn.Close() just returns the connection to the pool
defer conn.Close()

if err := conn.Err(); err != nil {
// conn.Err() will have connection or Dial related errors
return nil, err
}

关于go - 跨路由共享 Redis 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30244080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com