Heim  >  Artikel  >  Datenbank  >  So implementieren Sie die Redis-Lese- und Schreibtrennung in Go

So implementieren Sie die Redis-Lese- und Schreibtrennung in Go

PHPz
PHPznach vorne
2023-06-03 11:08:451185Durchsuche

    Warum müssen wir das RESP-Protokoll verstehen?

    Zu diesem Thema möchte ich anhand eines Beispiels erklären, warum wir das RESP-Protokoll verstehen müssen, wenn wir Redis-Middleware schreiben. Redis中间件,为什么需要了解RESP协议。

    So implementieren Sie die Redis-Lese- und Schreibtrennung in Go

    以上代码是编写了一个非常简单的TCP服务器,我们监听8888端口,尝试使用redis-cli -p 8888连接服务器后,而后查看打印出来的应用层报文。

    我们尝试执行下该代码,并且输入redis-cli -p 8888进行连接。

    我们编写的服务器获取redis客户端的报文为:

    *1

    COMMAND

    上面这个就是RESP协议的内容了,所以说,我们要编写一个Redis的中间件,我们需要先了解一下RESP协议才行。

    什么是RESP协议

    官网有相关的解释: https://redis.io/docs/reference/protocol-spec/

    RESP协议创建之初是专门为了Redis服务器和客户端的通信而设计的,该协议在Redis 1.2中引入,并且在Redis 2.0中,成为Redis通信的标准协议。该协议有如下优点:

    • 实现简单

    • 快速解析

    • 直接可阅读

    RESP根据其协议前缀,可以序列化不同的数据类型,例如: 整数、字符串、数组 等,还能标注 正常输出 和 错误输出等。除了流水线和发布订阅以外,RESP协议应该是最简单的请求-响应协议了。关于更多介绍,大佬们可以看看上面注释的官方文档。

    RESP协议规范

    RESP协议不同的部分使用rn

    Wie implementiert Go Redis Lese-/Schreibtrennung Der obige Code ist ein sehr einfacher TCP-Server. Wir hören den 8888-Port ab und versuchen, redis-cli zu verwenden -p 8888 Nachdem Sie eine Verbindung zum Server hergestellt haben, sehen Sie sich die gedruckte Meldung der Anwendungsschicht an.
    Das Obige ist der Inhalt des RESP-Protokolls. Wenn wir also eine Redis-Middleware schreiben möchten, müssen wir dies zuerst tun Verstehen Sie einfach das RESP-Protokoll.
  • Direkt lesbar

    RESP-Protokollspezifikation

    TypPräfixBemerkungen#🎜. 🎜 #Einfache ZeichenfolgeFehlerdaten# 🎜🎜 #-Fehlerdaten beginnen mit -integer:#🎜🎜 ## 🎜🎜#Ganzzahlen beginnen mit:
    Wir versuchen, diesen Code auszuführen und redis-cli -p 8888 einzugeben, um eine Verbindung herzustellen. Der von uns geschriebene Server erhält die Nachricht vom redis-Client: *1
    $7
    COMMAND
    Was ist das RESP-Protokoll? # Das RESP-Protokoll wurde ursprünglich für die Kommunikation zwischen dem Redis-Server und dem Client entwickelt. Das Protokoll wurde in Redis 1.2 eingeführt und in Redis 2.0 wird es zum Standardprotokoll für die Redis-Kommunikation. Dieses Protokoll hat folgende Vorteile: Einfache Implementierung Schnelle Analyse# 🎜 🎜#
  • RESPkann verschiedene Datentypen serialisieren, wie zum Beispiel Ganzzahlen, Zeichenfolgen, Arrays usw. können auch normale Ausgaben und Fehlerausgaben usw. markieren. Neben Pipelines und Publish and Subscribe sollte das RESP-Protokoll das einfachste Request-Response-Protokoll sein. Weitere Informationen finden Sie in der oben kommentierten offiziellen Dokumentation. RESP Verschiedene Teile des Protokolls werden mit rn (Zeilenumbruch) getrennt, was 5 unterstützt Es gibt drei Datentypen: einfache Zeichenfolgen, Fehler, Ganzzahlen, komplexe Zeichenfolgen und Arrays. Lassen Sie uns zur Erläuterung eine Tabelle erstellen.
    + Einfache Zeichenfolge beginnt mit +
    #🎜🎜##🎜🎜##🎜🎜#Komplexe Zeichenfolge #🎜🎜##🎜🎜#$#🎜🎜##🎜🎜#Komplexe Zeichenfolge beginnt mit $ Beginnend mit # 🎜🎜##🎜🎜##🎜🎜##🎜🎜#array#🎜🎜##🎜🎜#*#🎜🎜##🎜🎜#Array beginnend mit *#🎜🎜##🎜🎜##🎜🎜 ## 🎜🎜#

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

    若我们想执行

    set juejinName pdudo

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

    *3
    $3
    set
    $10
    juejinName
    $5
    pdudo

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

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

    So implementieren Sie die Redis-Lese- und Schreibtrennung in Go

    这就是协议的内容了。

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

    例如:

    +

    +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中执行一下呢

    So implementieren Sie die Redis-Lese- und Schreibtrennung in Go

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

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

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

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

    So implementieren Sie die Redis-Lese- und Schreibtrennung in Go

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

    主机 端口 密码 角色
    127.0.0.1 6379 主库
    127.0.0.1 7380 从库

    Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Redis-Lese- und Schreibtrennung in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen