>  기사  >  데이터 베이스  >  Go에서 Redis 읽기-쓰기 분리를 구현하는 방법

Go에서 Redis 읽기-쓰기 분리를 구현하는 방법

PHPz
PHPz앞으로
2023-06-03 11:08:451185검색

    왜 RESP 프로토콜을 이해해야 하나요?

    이 문제와 관련하여 Redis 미들웨어를 작성할 때 RESP 프로토콜을 이해해야 하는 이유를 설명하기 위해 예를 사용하고 싶습니다. Redis中间件,为什么需要了解RESP协议。

    Go에서 Redis 읽기-쓰기 분리를 구현하는 방법

    以上代码是编写了一个非常简单的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

    Redis 읽기-쓰기 분리를 구현하는 방법위 내용 코드가 작성되었습니다. 우리는 8888 포트를 수신하고 redis-cli -p 8888을 사용해 매우 간단한 TCP 서버를 만들었습니다. 서버에 연결한 다음 애플리케이션 계층 메시지를 봅니다.
    위는 RESP 프로토콜의 내용이 공개되었으므로 Redis 미들웨어를 작성하려면 먼저 RESP 프로토콜을 이해해야 합니다.
    간단한 구현
  • RESP프로토콜 접두사에 따라 정수, 문자열, 배열 등 다양한 데이터 유형을 직렬화할 수 있으며 정상 출력 및 오류 출력도 표시할 수 있습니다. 파이프라인과 게시 및 구독 외에도 RESP 프로토콜은 가장 간단한 요청-응답 프로토콜이어야 합니다. 자세한 소개는 위에 설명된 공식 문서를 확인하세요.

    RESP 프로토콜 사양

    RESP프로토콜의 여러 부분은 rn(줄 바꿈)을 사용하여 구분됩니다. 즉, 5가지 데이터 유형을 지원합니다. 간단한 문자열, 오류, 정수, 복잡한 문자열 및 배열로 구성되어 설명합니다. Prefix+
    이 코드를 실행하고 redis-cli -p 8888을 입력하여 연결을 시도합니다. 우리가 작성한 서버는 redis 클라이언트로부터 메시지를 다음과 같이 받습니다: *1
    $7
    COMMAND
    RESP 프로토콜이란 무엇입니까 공식 웹사이트에 관련 설명이 있습니다: https://redis.io/docs/reference/protocol-spec/ RESP프로토콜은 원래 Redis 서버와 클라이언트 간의 통신을 위해 설계된 이 프로토콜은 Redis 1.2에 도입되어 Redis 2.0에서 Redis가 되었습니다. 통신을 위한 표준 프로토콜입니다. 이 프로토콜에는 다음과 같은 장점이 있습니다.
    빠른 분석 직접 읽기 가능
    Type
    Remarks 단순 문자열
    단순 문자열은 + 로 시작 with -
    정수🎜 🎜 : egIntegers는 시작합니다 : 🎜🎜🎜🎜complex strings 🎜🎜 $ 🎜🎜complex 현악기 $ 🎜🎜🎜🎜 arrays 🎜🎜 *🎜🎜 arrays 시작 *🎜🎜🎜🎜 🎜🎜🎜🎜로 시작합니다.

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

    若我们想执行

    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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제