redigoがredis-cluster対応してない問題


概要

問題点

  • redis-go-clusterでもやってるように、複数Nodeの選択が出来ない
  • Node選択が出来ないので、
    MOVED 1525 127.0.0.1:6379(値が別のNodeに格納されてるよ!というエラー)が返ってくる

調査

Node IPとPort
Node1 127.0.0.1:6379
Node2 127.0.0.1:6380
Node3 127.0.0.1:6381

通常メソッドでのSET GET

package main

import (
    "fmt"
    "os"

    // https://github.com/garyburd/redigo/pull/170 分をbranch切ってる状態
    "github.com/garyburd/redigo/redis"
)

func main() {
    c, err := redis.Dial("tcp", "127.0.0.1:6380") // わかりやすいようにこのポートで

    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    // Connection Close
    defer c.Close()

    // SET
    t, err := c.Do("SET", "hoge", "fuga")
    if err != nil {
        fmt.Println("SET_ERR", err)
    }
    fmt.Printf("SET: %#v\n", t)

    // GET
    s, err := redis.String(c.Do("GET", "hoge"))
    if err != nil {
        fmt.Println("GET_ERR", err)
    }
    fmt.Printf("GET: %#v\n", s)
}

// SET_ERR MOVED 1525 127.0.0.1:6379
// SET: "MOVED 1525 127.0.0.1:6379"
// GET_ERR MOVED 1525 127.0.0.1:6379
// GET: ""

Cluster用メソッドを用いたのSET GET

package main

import (
    "fmt"
    "os"

    // https://github.com/garyburd/redigo/pull/170 分をbranch切ってる状態
    "github.com/garyburd/redigo/redis"
)

func main() {
    c, err := redis.NewCluster("tcp", []string{"127.0.0.1:6379", "127.0.0.1:6380", "127.0.0.1:6381"})

    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    // Connection Close
    defer c.Close()

    // SET
    t, err := c.Do("SET", "hoge", "fuga")
    if err != nil {
        fmt.Println("SET_ERR", err)
    }
    fmt.Printf("SET: %#v\n", t)

    // GET
    s, err := redis.String(c.Do("GET", "hoge"))
    if err != nil {
        fmt.Println("GET_ERR", err)
    }
    fmt.Printf("GET: %#v\n", s)
}

// SET: "OK"
// GET: "fuga"

最後に