Example #1
0
func ExampleNewFailoverClient() {
	client := redis.NewFailoverClient(&redis.FailoverOptions{
		MasterName:    "master",
		SentinelAddrs: []string{":26379"},
	})

	pong, err := client.Ping().Result()
	fmt.Println(pong, err)
	// Output: PONG <nil>
}
Example #2
0
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)
	}
}