版權所有,請勿轉載。
谷歌的go-redis模塊對redis cluster集羣提供了支持,通過:func NewClusterClient(opt *ClusterOptions) *ClusterClient函數可以得到一個面向redis集羣的客戶端,後續使用基本等同於非集羣客戶端redis.Client。參數配置詳見如下示例:
client := redis.NewClusterClient(&redis.ClusterOptions{
//-------------------------------------------------------------------------------------------
//集羣相關的參數
//集羣節點地址,理論上只要填一個可用的節點客戶端就可以自動獲取到集羣的所有節點信息。但是最好多填一些節點以增加容災能力,因爲只填一個節點的話,如果這個節點出現了異常情況,則Go應用程序在啓動過程中無法獲取到集羣信息。
Addrs: []string{"127.0.0.1:7000", "127.0.0.1:7001", "127.0.0.1:7002", "127.0.0.1:7003", "127.0.0.1:7004", "127.0.0.1:7005"},
MaxRedirects: 8, // 當遇到網絡錯誤或者MOVED/ASK重定向命令時,最多重試幾次,默認8
//只含讀操作的命令的"節點選擇策略"。默認都是false,即只能在主節點上執行。
ReadOnly: false, // 置爲true則允許在從節點上執行只含讀操作的命令
// 默認false。 置爲true則ReadOnly自動置爲true,表示在處理只讀命令時,可以在一個slot對應的主節點和所有從節點中選取Ping()的響應時長最短的一個節點來讀數據
RouteByLatency: false,
// 默認false。置爲true則ReadOnly自動置爲true,表示在處理只讀命令時,可以在一個slot對應的主節點和所有從節點中隨機挑選一個節點來讀數據
RouteRandomly: false,
//用戶可定製讀取節點信息的函數,比如在非集羣模式下可以從zookeeper讀取。
//但如果面向的是redis cluster集羣,則客戶端自動通過cluster slots命令從集羣獲取節點信息,不會用到這個函數。
ClusterSlots: func() ([]ClusterSlot, error) {
},
//鉤子函數,當一個新節點創建時調用,傳入的參數是新建的redis.Client
OnNewNode: func(*Client) {
},
//------------------------------------------------------------------------------------------------------
//ClusterClient管理着一組redis.Client,下面的參數和非集羣模式下的redis.Options參數一致,但默認值有差別。
//初始化時,ClusterClient會把下列參數傳遞給每一個redis.Client
//鉤子函數
//僅當客戶端執行命令需要從連接池獲取連接時,如果連接池需要新建連接則會調用此鉤子函數
OnConnect: func(conn *redis.Conn) error {
fmt.Printf("conn=%v\n", conn)
return nil
},
Password: "",
//每一個redis.Client的連接池容量及閒置連接數量,而不是cluterClient總體的連接池大小。實際上沒有總的連接池
//而是由各個redis.Client自行去實現和維護各自的連接池。
PoolSize: 15, // 連接池最大socket連接數,默認爲5倍CPU數, 5 * runtime.NumCPU
MinIdleConns: 10, //在啓動階段創建指定數量的Idle連接,並長期維持idle狀態的連接數不少於指定數量;。
//命令執行失敗時的重試策略
MaxRetries: 0, // 命令執行失敗時,最多重試多少次,默認爲0即不重試
MinRetryBackoff: 8 * time.Millisecond, //每次計算重試間隔時間的下限,默認8毫秒,-1表示取消間隔
MaxRetryBackoff: 512 * time.Millisecond, //每次計算重試間隔時間的上限,默認512毫秒,-1表示取消間隔
//超時
DialTimeout: 5 * time.Second, //連接建立超時時間,默認5秒。
ReadTimeout: 3 * time.Second, //讀超時,默認3秒, -1表示取消讀超時
WriteTimeout: 3 * time.Second, //寫超時,默認等於讀超時,-1表示取消讀超時
PoolTimeout: 4 * time.Second, //當所有連接都處在繁忙狀態時,客戶端等待可用連接的最大等待時長,默認爲讀超時+1秒。
//閒置連接檢查包括IdleTimeout,MaxConnAge
IdleCheckFrequency: 60 * time.Second, //閒置連接檢查的週期,無默認值,由ClusterClient統一對所管理的redis.Client進行閒置連接檢查。初始化時傳遞-1給redis.Client表示redis.Client自己不用做週期性檢查,只在客戶端獲取連接時對閒置連接進行處理。
IdleTimeout: 5 * time.Minute, //閒置超時,默認5分鐘,-1表示取消閒置超時檢查
MaxConnAge: 0 * time.Second, //連接存活時長,從創建開始計時,超過指定時長則關閉連接,默認爲0,即不關閉存活時長較長的連接
})
defer client.Close()
相關文章: