1 回答

TA贡献1859条经验 获得超6个赞
您可以有一个并发写入器和一个并发读取器。因为Do结合了读取和写入操作,您可以对Do. 换句话说,您不能Do同时调用。您不能将连接存储在全局变量中并在Do不使用互斥锁保护连接或使用其他机制来确保不超过一个并发调用者的情况下调用Do.
池支持并发访问。poolGet方法返回的连接遵循上述并发规则。为了获得对数据库的完全并发访问,应用程序应该在单个 goroutine 中执行以下操作: Get来自池的连接;在连接上执行 Redis 命令; Close将基础资源返回到池的连接。
换成redisConn redis.Conn水池。在应用启动时初始化池:
var redisPool *redis.Pool
...
redisPool = &redis.Pool{
MaxIdle: 3, // adjust to your needs
IdleTimeout: 240 * time.Second, // adjust to your needs
Dial: func () (redis.Conn, error) {
c, err := redis.Dial(config.RedisProtocol, config.RedisAddress)
if err != nil {
return nil, err
}
if _, err := c.Do("AUTH", config.RedisPass); err != nil {
c.Close()
return nil, err
}
return c, err
},
}
使用池发布到频道:
c := redisPool.Get()
if _, err = c.Do("PUBLISH", fmt.Sprintf("user:%d", fromId), message); err != nil {
log.Println(err)
}
if _, err = c.Do("PUBLISH", fmt.Sprintf("user:%d", toId), message); err != nil {
log.Println(err)
}
c.Close()
不要在redisInit(). 不能保证redisInit()会在应用程序中的其他代码使用池之前执行。
还要添加对订阅或PSubscribe的调用。
- 1 回答
- 0 关注
- 258 浏览
添加回答
举报