ホームページ  >  記事  >  データベース  >  Go で Redis の読み取りと書き込みの分離を実装する方法

Go で Redis の読み取りと書き込みの分離を実装する方法

PHPz
PHPz転載
2023-06-03 11:08:451183ブラウズ

    なぜ RESP プロトコルを理解する必要があるのでしょうか?

    この問題に関して、Redis ミドルウェアを作成するときに RESP プロトコルを理解する必要がある理由を例を通して説明したいと思います。

    Go で Redis の読み取りと書き込みの分離を実装する方法

    上記のコードは非常に単純な TCP サーバーです。8888 ポートをリッスンし、 を使用しようとします。 redis -cli -p 8888サーバーに接続した後、印刷されたアプリケーション層メッセージを表示します。

    このコードを実行し、redis-cli -p 8888 と入力して接続してみます。

    私たちが作成したサーバーは、redis クライアントからメッセージを取得します:

    #*1

    $7
    COMMAND

    上記は

    RESP プロトコルの内容であるため、Redis ミドルウェアを作成したい場合は、まず RESP プロトコルを理解する必要があります。

    RESP プロトコルとは

    公式 Web サイトに関連する説明があります: https://redis.io/docs/reference/protocol-spec/

    RESPこのプロトコルはもともと Redis サーバーとクライアント間の通信用に設計されました。このプロトコルは Redis 1.2 で導入され、Redis 2.0 で標準プロトコルになりました。 Redis 通信用。このプロトコルには次の利点があります。

      #シンプルな実装
    • 迅速な分析
    • 直接読み取り可能
    RESP

    そのプロトコル プレフィックスに従って、整数、文字列、配列などのさまざまなデータ型をシリアル化でき、通常の出力とエラー出力もシリアル化できます。マークされます。パイプラインとパブリッシュとサブスクライブに加えて、RESP プロトコルは最も単純な要求/応答プロトコルである必要があります。詳細については、上記の公式ドキュメントを参照してください。 RESP プロトコル仕様

    RESP

    プロトコルの異なる部分は \r\n (改行文字) を使用して区切られ、5 種類をサポートします。データの種類は、単純な文字列、エラー、整数、複雑な文字列、配列です。

    #タイププレフィックス備考単純な文字列単純な文字列は エラー データ-エラー データは - ## で始まります:##複雑な文字列$複雑な文字列$Array** で始まる配列

    我当初看到这个的时候,也是迷迷糊糊的,到底什么意思呢? 哎,我们举个例子你就明白了。

    若我们想执行

    set juejinName pdudo

    若使用RESP 协议应当如何编写呢?应当编写如下:

    *3
    $3
    set
    $10
    juejinName
    $5
    pdudo

    那我们来解释一下*3代表有3个数组,而$3代表复杂字符串有长度为3,值为set$10代表复杂字符串长度为10,值为juejinName$5代表复杂字符串长度为5,值为pdudo

    我们结合上述信息,可以画一张图。

    Go で Redis の読み取りと書き込みの分離を実装する方法

    这就是协议的内容了。

    而协议前缀+-:则要简单的多,直接跟数据即可,

    例如:

    +

    +OK

    -

    -ERR syntax error

    :

    :3

    如何使用该协议请求Redis

    我们已经学习了相关的RESP协议,那么我们如何学习呢? 我们可以使用telnet命令来操作即可。

    在此,我们准备几条命令,我们会将其转换为RESP格式,且将其发送到redis服务器。

    命令

    set name pdudo
    get name
    lpush pn 1
    llen pn

    转换为RESP格式

    *3
    $3
    set
    $4
    name
    $5
    pdudo
    *2
    $3
    get
    $4
    name
    *3
    $5
    lpush
    $2
    pn
    $1
    1
    *2
    $4
    llen
    $2
    pn

    我们将其放置到telnet中执行一下呢

    Go で Redis の読み取りと書き込みの分離を実装する方法

    现在回头看看官网文档所提及的,该协议实现简单,直接可阅读,是不是理解的更加深刻了呢?

    使用go编写Redis中间件实现读写分离

    本篇暂不解释代码,而后单独开一篇谈论中间件代码。

    实现该功能,其实本质上是区分命令是查询还是写入,若是查询,则直接转发到从库,而写入,则转发到主库即可,其架构图可以理解为如下:

    Go で Redis の読み取りと書き込みの分離を実装する方法

    我们已经有了目前的架构。

    #整数
    整数は次で始まります:
    主机 端口 密码 角色
    127.0.0.1 6379 主库
    127.0.0.1 7380 从库

    以上がGo で Redis の読み取りと書き込みの分離を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。