func ExampleNewFailoverClient() { client := redis.NewFailoverClient(&redis.FailoverOptions{ MasterName: "master", SentinelAddrs: []string{":26379"}, }) pong, err := client.Ping().Result() fmt.Println(pong, err) // Output: PONG <nil> }
func TestSentinel(t *testing.T) { masterName := "mymaster" masterPort := "8123" slavePort := "8124" sentinelPort := "8125" masterCmd, err := startRedis(masterPort) if err != nil { t.Fatal(err) } defer masterCmd.Process.Kill() // Wait for master to start. time.Sleep(200 * time.Millisecond) master := redis.NewTCPClient(&redis.Options{ Addr: ":" + masterPort, }) if err := master.Ping().Err(); err != nil { t.Fatal(err) } slaveCmd, err := startRedisSlave(slavePort, masterPort) if err != nil { t.Fatal(err) } defer slaveCmd.Process.Kill() // Wait for slave to start. time.Sleep(200 * time.Millisecond) slave := redis.NewTCPClient(&redis.Options{ Addr: ":" + slavePort, }) if err := slave.Ping().Err(); err != nil { t.Fatal(err) } sentinelCmd, err := startRedisSentinel(sentinelPort, masterName, masterPort) if err != nil { t.Fatal(err) } defer sentinelCmd.Process.Kill() // Wait for sentinel to start. time.Sleep(200 * time.Millisecond) sentinel := redis.NewTCPClient(&redis.Options{ Addr: ":" + sentinelPort, }) if err := sentinel.Ping().Err(); err != nil { t.Fatal(err) } defer sentinel.Shutdown() client := redis.NewFailoverClient(&redis.FailoverOptions{ MasterName: masterName, SentinelAddrs: []string{":" + sentinelPort}, }) if err := client.Set("foo", "master").Err(); err != nil { t.Fatal(err) } val, err := master.Get("foo").Result() if err != nil { t.Fatal(err) } if val != "master" { t.Fatalf(`got %q, expected "master"`, val) } // Kill Redis master. if err := masterCmd.Process.Kill(); err != nil { t.Fatal(err) } if err := master.Ping().Err(); err == nil { t.Fatalf("master was not killed") } // Wait for Redis sentinel to elect new master. time.Sleep(5 * time.Second) // Check that client picked up new master. val, err = client.Get("foo").Result() if err != nil { t.Fatal(err) } if val != "master" { t.Fatalf(`got %q, expected "master"`, val) } }