Skip to content

Instantly share code, notes, and snippets.

@shichi-at-nttr
Last active August 7, 2018 13:59
Show Gist options
  • Save shichi-at-nttr/e655dd68ccf46296b6bd56f0f9383c4c to your computer and use it in GitHub Desktop.
Save shichi-at-nttr/e655dd68ccf46296b6bd56f0f9383c4c to your computer and use it in GitHub Desktop.
Go言語でクラスタ・非クラスタのRedisを区別なく扱う

Go言語から go-redis でRedisクラスタを使う。

go-redis自体はRedisクラスタに対応しているが、クラスタと非クラスタでは接続の型が異なる。 単純なアクセス部分のアプリケーションは、Redisがクラスタかそうでないかを意識せず書きたい。

接続時のみ、(設定ファイル等からクラスタモードを取得し) 接続方式を変える必要があるが、 interfaceを用いることで、その後のハンドリングはクラスタ/非クラスタを同一に記述するためのサンプル。

package main
import (
"fmt"
"time"
"github.com/go-redis/redis"
)
// クラスタと非クラスタを一律に扱うためのインタフェース
type universalClient interface {
Ping() *redis.StatusCmd
Get(key string) *redis.StringCmd
Set(key string, value interface{}, expiration time.Duration) *redis.StatusCmd
}
// 接続だけはクラスタと非クラスタで異なる
func newSingleClient(addr string) universalClient {
r := redis.NewClient(&redis.Options{
Addr: addr,
})
return r
}
func newClusterClient(addr string) universalClient {
r := redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{addr},
})
return r
}
// ここから実際の使い方
func main() {
// シングル構成
fmt.Println("---------- Single")
r1 := newSingleClient("ip.address.to.redis:6379")
fmt.Println(r1.Ping())
fmt.Println(r1.Get("key1"))
fmt.Println(r1.Set("key1", "value1", 30*time.Second))
fmt.Println(r1.Get("key1"))
// クラスタ構成
fmt.Println("\n---------- Cluster")
r2 := newClusterClient("ip.address.to.cluster:6379")
fmt.Println(r2.Ping())
fmt.Println(r2.Get("key1"))
fmt.Println(r2.Set("key1", "value1", 30*time.Second))
fmt.Println(r2.Get("key1"))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment