Redis 环

提示

要了解如何使用 go-redis 客户端,请参阅 入门 指南。

介绍

Ring 是一个 Redis 客户端,它使用一致性哈希将键分配到多个 Redis 服务器(分片)上。它对多个 goroutine 的并发使用是安全的。

Ring 监控每个分片的状态,并将失效的分片从环中移除。当分片上线时,它会被重新添加到环中。这可以实现最大可用性和分区容错性,但不同分片之间甚至不同客户端之间没有一致性。每个客户端使用对其可用的分片,并且在分片状态更改时不会与其他客户端进行任何协调。

当您需要多个 Redis 服务器进行缓存并且可以容忍其中一台服务器死机时丢失数据时,应该使用 Ring。否则,您应该使用 Redis 集群Redis 服务器

快速入门

要创建一个包含 3 个分片的 Ring 集群

import "github.com/redis/go-redis/v9"

rdb := redis.NewRing(&redis.RingOptions{
    Addrs: map[string]string{
        // shardName => host:port
        "shard1": "localhost:7000",
        "shard2": "localhost:7001",
        "shard3": "localhost:7002",
    },
})

然后,客户端可以像往常一样使用

if err := rdb.Set(ctx, "foo", "bar", 0).Err(); err != nil {
    panic(err)
}

要遍历分片

err := rdb.ForEachShard(ctx, func(ctx context.Context, shard *redis.Client) error {
    return shard.Ping(ctx).Err()
})
if err != nil {
    panic(err)
}

每个分片的选项

要更改分片连接选项

rdb := redis.NewRing(&redis.RingOptions{
    NewClient: func(opt *redis.Options) *redis.NewClient {
        user, pass := userPassForAddr(opt.Addr)
        opt.Username = user
        opt.Password = pass

        return redis.NewClient(opt)
    },
})

键分配

默认情况下,Ring 使用 Rendezvous在新窗口中打开 哈希将键分配到多个分片上。但是您可以更改默认的一致性哈希实现

import "github.com/golang/groupcache/consistenthash"

ring := redis.NewRing(&redis.RingOptions{
    NewConsistentHash: func() {
        return consistenthash.New(100, crc32.ChecksumIEEE)
    },
})

另请参阅