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 關注
- 242 瀏覽
添加回答
舉報