概要
- goでredis操作する定番のredigoがredis cluster対応されてないので、SET GETなど出来ない
- 一応PRは出てる。https://github.com/garyburd/redigo/pull/170
- redis-go-clusterは対応してるっぽい
問題点
- redis-go-clusterでもやってるように、複数Nodeの選択が出来ない
- Node選択が出来ないので、
MOVED 1525 127.0.0.1:6379
(値が別のNodeに格納されてるよ!というエラー)が返ってくる
調査
- https://github.com/garyburd/redigo/pull/170 をブランチ切って実験
- ノード情報は下記の通り
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"
最後に
- 早くmergeされて欲しい
- https://github.com/garyburd/redigo/pull/170 がmergeされたらこの記事は消します