pool.goファイルを変更し、pushBackメソッドを追加して、使用済み接続をキューの末尾に戻すことで、接続のラウンドロビンを実現できます。pushBackメソッドとLifoフィールドはredigo公式のものではなく、公式pool.goのカスタマイズ改造です。redigo公式接続プール(現時点のmaster時点)のidleListはpushFront、popFront、popBackメソッドのみを提供し、接続返却時にpushFront(キュー先頭に戻す)を採用するため、それ自体がLIFO(後入れ先出し)動作となり、公式にはLifo設定項目はありません。接続をFIFO(ラウンドロビン)に変更して均等に使用する必要がある場合は、本文に従ってpushBackを追加し、返却ロジックを改造する必要があります。具体的にはredigo公式ソースコードを基準とし、ご自身でコンパイルして検証してください。pool.goでidleListにpushBackメソッドを追加し、接続をキューの末尾に追加します:// idle connect push list backfunc (l *idleList) pushBack(pc *poolConn) {if l.count == 0 {l.front = pcl.back = pcpc.prev = nilpc.next = nil} else {pc.prev = l.backl.back.next = pcl.back = pcpc.next = nil}l.count++}
Pool構造体にLifoフィールドを追加し、接続の返却位置を制御します:// idle connection in the pool method// True: pushBack, False: pushFront, default FalseLifo bool
put)ロジックでは、Lifoに基づいて接続をキューの先頭に戻すか末尾に戻すかを決定します:if p.Lifo == true {p.idle.pushBack(pc) // キューの末尾に戻します。} else {p.idle.pushFront(pc) // キューの先頭に戻します(デフォルト)}
Lifoをtrueに設定し、使用済み接続をキューの末尾に戻すことで、接続のラウンドロビンと負荷分散を実現します:// 接続プールを確立します。redisClient = &redis.Pool{MaxIdle: maxIdle,MaxActive: maxActive,IdleTimeout: MaxIdleTimeout * time.Second,Wait: true,Lifo: true, // trueに設定すると、使用済み接続をキューの末尾に戻します。Dial: func() (redis.Conn, error) {con, err := redis.Dial("tcp", conf["Host"].(string),redis.DialPassword(conf["Password"].(string)),redis.DialDatabase(int(conf["Db"].(int64))),redis.DialConnectTimeout(timeout*time.Second),redis.DialReadTimeout(timeout*time.Second),redis.DialWriteTimeout(timeout*time.Second))if err != nil {return nil, err}return con, nil},}
Lifo: trueを設定した後、以下の方法で接続が均等に使用されていることを確認できます:LifoフィールドとpushBackメソッドは存在しません。接続返却時はpushFront(キュー先頭に戻す)を採用しており、それ自体がLIFO動作となります。本文のFIFOラウンドロビン機能はカスタマイズ改造によるものであり、依存関係をアップグレードした後はこの変更を再度マージする必要があります(forkまたはvendorで管理することをお勧めします)。適用前に、使用バージョンの公式ソースコードを確認し、ご自身でコンパイルして検証してください。文档反馈