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