いくつかの高度な使用法を-のRedisにGO

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スロットを割り当てられて知っているslotCRC16(キー:特定のアルゴリズムがあり、その後、ノードは、このキーハッシュスロット間隔に割り当てられます、 )%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)
    }
}

おすすめ

転載: www.cnblogs.com/ExMan/p/11493586.html