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")) | |
} |