1.はじめに
Redisのライブラリ、おそらく最もよく使われるのGolangをいえば
redigo と ゴーRedisの。どの redigo
クラスタへのアクセスをサポートしていません。
この記事では、についてお話したいと思いgo-redis
2つの高度な使い方
2.クラスタのスレーブノードへのアクセスを有効にします
Redisのクラスタの比較的高い負荷では、読み取ることが許可されている場合には、大幅スレーブノードクラスタの処理能力が向上します。
次の三つのパラメータによって影響を受けるスレーブ・ノードへのオープンアクセス
type ClusterOptions struct {
// Enables read-only commands on slave nodes.
ReadOnly bool
// Allows routing read-only commands to the closest master or slave node.
// It automatically enables ReadOnly.
RouteByLatency bool
// Allows routing read-only commands to the random master or slave node.
// It automatically enables ReadOnly.
RouteRandomly bool
...
}
go-redis
次のように選択した論理ノード
func (c *ClusterClient) cmdSlotAndNode(cmd Cmder) (int, *clusterNode, error) {
state, err := c.state.Get()
if err != nil {
return 0, nil, err
}
cmdInfo := c.cmdInfo(cmd.Name())
slot := cmdSlot(cmd, cmdFirstKeyPos(cmd, cmdInfo))
if c.opt.ReadOnly && cmdInfo != nil && cmdInfo.ReadOnly {
if c.opt.RouteByLatency {
node, err := state.slotClosestNode(slot)
return slot, node, err
}
if c.opt.RouteRandomly {
node := state.slotRandomNode(slot)
return slot, node, nil
}
node, err := state.slotSlaveNode(slot)
return slot, node, err
}
node, err := state.slotMasterNode(slot)
return slot, node, err
}
- 読み取り専用= trueの場合、唯一の選択
Slave Node
- 読み取り専用= trueおよびRouteByLatency = trueの場合
slot
、対応するMaster Node
とSlave Node
選択、選択ポリシーは、次のとおり選択PING
最下位ノード遅延 - 以下からの読み取り専用=真とRouteRandomly = trueの場合
slot
、対応するMaster Node
とSlave Node
選択、選択ポリシー:ランダムな選択
3.クラスタモードでパイプライン機能を使用します
パイプラインのRedisの原則機能は、1回のクライアントは、各コマンドのIOのオーバーヘッドが送信されている削減、Redisのサーバーは、コマンドを複数のRedisに送信されますです。システムコールの数を減らし、そしてつつ、全体的な処理能力を向上させます。
我々はメインに- Redisのモードから、パイプライン機能は多くを使用する必要がありますが、クラスタモードでは、少数の人々が使用していると推定されます。
当社は、剰余が属し得るためにCRC16アルゴリズムを使用します、我々はキーを設定する際のRedisクラスタのデフォルトは、16,384スロットを割り当てられて知っているslot
CRC16(キー:特定のアルゴリズムがあり、その後、ノードは、このキーハッシュスロット間隔に割り当てられます、 )%16384。我々はパイプライン機能を使用する場合は、バッチ内の複数のコマンドが含まれている、関与する重要な各コマンドが異なるに属していてもよいですslot
go-redis
この問題を解決するために、三つのステップの
ソースを読み取ることができる defaultProcessPipelineを
1)計算されるcommand
属するslot
に従って、slot
右の選択Cluster Node
に2で)Cluster Node
すべてをcommand
一括送信(同時操作)で、
3)受信結果
注:このgo-redis
順序は単純ですが、それぞれがcommand
唯一含むことができるkey
、または次のエラーを受け取ることができます
err CROSSSLOT Keys in request don't hash to the same slot
それ行く-Redisのは、同様のサポートされていない MGET
コマンドの使用法を
簡単な例
package main
import (
"github.com/go-redis/redis"
"fmt"
)
func main() {
client := redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{"192.168.120.110:6380", "192.168.120.111:6380"},
ReadOnly: true,
RouteRandomly: true,
})
pipe := client.Pipeline()
pipe.HGetAll("1371648200")
pipe.HGetAll("1371648300")
pipe.HGetAll("1371648400")
cmders, err := pipe.Exec()
if err != nil {
fmt.Println("err", err)
}
for _, cmder := range cmders {
cmd := cmder.(*redis.StringStringMapCmd)
strMap, err := cmd.Result()
if err != nil {
fmt.Println("err", err)
}
fmt.Println("strMap", strMap)
}
}