go实现Redis读写分离示例详解

目录
  • 我们为什么需要了解RESP协议?
  • 什么是RESP协议
    • RESP协议规范
    • 如何使用该协议请求Redis
    • 使用go编写Redis中间件实现读写分离
  • 总结

我们为什么需要了解RESP协议?

本篇文章目的为探究RESP协议,而非编写读写中间件,这点要清楚。

关于这个问题,我想通过一个实例来解释,我们编写Redis中间件,为什么需要了解RESP协议。

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

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

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

*1
$7
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协议不同的部分使用\r\n(换行符)来进行分割,其支持5种数据类型,分别为: 简单字符串、错误、整数、复杂字符串 和 数组组成,我们列个表格来讲下。

类型 前缀 备注
简单字符串 + 简单字符串以+开头
错误数据 - 错误数据以-开头
整数 : 整数以:开头
复杂字符串 $ 复杂字符串以$开头
数组 * 数组以*开头

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

若我们想执行

set juejinName pdudo

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

*3
$3
set
$10
juejinName
$5
pdudo

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

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

这就是协议的内容了。

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

例如:

+

+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中间件实现读写分离

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

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

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

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

相关代码已经放到了 gitee.com/pdudo/golea…

我们来看看实际效果呢:

总结

其实本篇文章核心的点是探究RESP协议,而我们使用go编写了一个软件,用于解析RESP协议,从而获取执行的命令,再根据命令属性,从而转发从库或者主库,以此来达到读写分离的效果。再次提及一下核心点是拆解RESP协议。

怎么样,好玩吧,动动你的小手指,快来试试吧。

以上就是go实现Redis读写分离示例详解的详细内容,更多关于go Redis读写分离的资料请关注我们其它相关文章!

(0)

相关推荐

  • GoFrame gredis配置文件及配置方法对比

    目录 前言摘要 GoFrame gredis 配置文件(推荐) 使用示例: 打印结果 配置方法(高级) 使用示例: 总结 前言摘要 上一篇文章为大家介绍了 GoFrame gcache使用实践 | 缓存控制 淘汰策略 ,得到了大家积极的反馈. 后续几篇文章再接再厉,仍然为大家介绍GoFrame框架缓存相关的知识点,以及自己项目使用中的一些总结思考,GoFrame框架下文简称gf. GoFrame gredis goframe框架支持两种方式来管理redis配置和获取redis对象,一种是通过配置

  • Golang实现基于Redis的可靠延迟队列

    目录 前言 原理详解 pending2ReadyScript ready2UnackScript unack2RetryScript ack consume 前言 在之前探讨延时队列的文章中我们提到了 redisson delayqueue 使用 redis 的有序集合结构实现延时队列,遗憾的是 go 语言社区中并无类似的库.不过问题不大,没有轮子我们自己造. 本文的完整代码实现在hdt3213/delayqueue,可以直接 go get 安装使用. 使用有序集合结构实现延时队列的方法已经广为

  • Go操作redis与redigo的示例解析

    目录 Go-操作redis 安装 连接 使用 设置key过期时间 批量获取mget.批量设置mset 列表操作 hash操作 Pipelining(管道) redis发布会订阅模式 事务操作 万能操作 连接redis 写入 读取 全部代码 Go-操作redis 安装 golang操作redis的客户端包有多个比如redigo.go-redis,github上Star最多的莫属redigo. github地址:https://github.com/garyburd/redigo 目前已经迁移到:h

  • go redis之redigo的使用

    目录 安装 链接Redis String类型操作 设置过期时间 List操作 Hash表 Redis连接池 本文主要介绍了go redis之redigo的使用,分享给大家,具体如下: 安装 go-redis 三方库为我们封装了很多函数来执行 Redis 命令,而 redigo 三方库只有一个 Do 函数执行 Redis 命令,更接近使用 redis-cli 操作 Redis.go-redis 支持连接哨兵及集群模式的Redis go get github.com/gomodule/redigo

  • golang redis中Pipeline通道的使用详解

    目录 一.pipeline出现的背景 二.pipeline的用法 pipeline命令的使用 goredis库连接客户端 package client import (     "github.com/go-redis/redis"     "github.com/sirupsen/logrus" ) var MainRDS *redis.Client func init() {     ConnectRedis() } func ConnectRedis() {

  • golang连接redis库及基本操作示例过程

    目录 Redis介绍 Redis支持的数据结构 Redis应用场景 准备Redis环境 go-redis库 安装 连接 V8新版本相关 连接Redis哨兵模式 连接Redis集群 基本使用 HVals set/get示例 zset示例 根据前缀获取Key 执行自定义命令 按通配符删除key Pipeline 事务 Watch Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,很多业务场景下的问题都可以很自然地映射到这些数据结构上.除此之外,通过复制.持久化

  • go实现Redis读写分离示例详解

    目录 我们为什么需要了解RESP协议? 什么是RESP协议 RESP协议规范 如何使用该协议请求Redis 使用go编写Redis中间件实现读写分离 总结 我们为什么需要了解RESP协议? 本篇文章目的为探究RESP协议,而非编写读写中间件,这点要清楚. 关于这个问题,我想通过一个实例来解释,我们编写Redis中间件,为什么需要了解RESP协议. 以上代码是编写了一个非常简单的TCP服务器,我们监听8888端口,尝试使用redis-cli -p 8888连接服务器后,而后查看打印出来的应用层报文

  • Spring AOP切面解决数据库读写分离实例详解

    Spring AOP切面解决数据库读写分离实例详解 为了减轻数据库的压力,一般会使用数据库主从(master/slave)的方式,但是这种方式会给应用程序带来一定的麻烦,比如说,应用程序如何做到把数据写到master库,而读取数据的时候,从slave库读取.如果应用程序判断失误,把数据写入到slave库,会给系统造成致命的打击. 解决读写分离的方案很多,常用的有SQL解析.动态设置数据源.SQL解析主要是通过分析sql语句是insert/select/update/delete中的哪一种,从而对

  • Mysql主从复制与读写分离图文详解

    文章思维导图 为什么使用主从复制.读写分离 主从复制.读写分离一般是一起使用的.目的很简单,就是为了提高数据库的并发性能. 你想,假设是单机,读写都在一台MySQL上面完成,性能肯定不高. 如果有三台MySQL,一台mater只负责写操作,两台salve只负责读操作,性能不就能大大提高了吗? 所以主从复制.读写分离就是为了数据库能支持更大的并发. 随着业务量的扩展.如果是单机部署的MySQL,会导致I/O频率过高. 采用主从复制.读写分离可以提高数据库的可用性. 主从复制的原理 ①当Master

  • GO文件创建及读写操作示例详解

    目录 三种文件操作比较 ioutil ioutil.ReadFile读 ioutil.WriteFile 写 ioutil.ReadAll 读 ioutil.ReadDir 查看路径下目录信息 ioutil.TempDir 创建临时目录 ioutil.TempFile 创建临时文件 os.file 方法 os.OpenFile() 创建文件 写入数据三种方式 第一种-WriteString( )函数 第二种-Write( )函数 第三种-WriteAt( )函数 读取文件 Read 读取文件 按

  • java EasyExcel面向Excel文档读写逻辑示例详解

    目录 正文 1 快速上手 1.1 引入依赖 1.2 导入与导出 2 实现原理 2.1 @RequestExcel 与 @ResponseExcel 解析器 2.2 RequestMappingHandlerAdapter 后置处理器 3 总结 正文 EasyExcel是一款由阿里开源的 Excel 处理工具.相较于原生的Apache POI,它可以更优雅.快速地完成 Excel 的读写功能,同时更加地节约内存. 即使 EasyExcel 已经很优雅了,但面向 Excel 文档的读写逻辑几乎千篇一

  • MySQL 读写分离实例详解

    MySQL 读写分离 MySQL读写分离又一好办法 使用 com.mysql.jdbc.ReplicationDriver 在用过Amoeba 和 Cobar,还有dbware 等读写分离组件后,今天我的一个好朋友跟我讲,MySQL自身的也是可以读写分离的,因为他们提供了一个新的驱动,叫 com.mysql.jdbc.ReplicationDriver 说明文档:http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-replic

  • Discuz!NT数据库读写分离方案详解

    目前在Discuz!NT这个产品中,数据库作为数据持久化工具,必定在并发访问频繁且负载压力较大的情况下成 为系统性能的'瓶颈'.即使使用本地缓存等方式来解决频繁访问数据库的问题,但仍旧会有大量的并发请求要访问动态数据,虽然 SQL2005及2008以上版本中性能不断提升,查询计划和存储过程运行得越来越高效,但最终还是 要面临'瓶颈'这一问 题.当然这也是许多大型网站不断研究探索各式各样的方案来有效降低数据访问负荷的原 因, 其中的'读写分离'方案就是一种被广泛采用的方案.      Discuz

  • node上的redis调用优化示例详解

    前言 如果一个 Node 应用有多台服务器或多个进程在跑,每个进程都拥有自己的内存空间,各个进程之间的数据共享就显得非常重要. 使用数据库是一个解决数据共享的方案,但一些临时性.高并发的数据并不太适合直接写入数据库,比如 session. 引入 Redis 可以解决数据共享的问题,也因为 Redis 是基于内存存储的特点,有着非常高的性能,可以大大降低数据库读写的压力,提升应用的整体性能. Redis 还可以用来:缓存复杂的数据库查询结果,做自增长统计,暂存用户操作状态等功能. 最近负责的nod

  • js中的cookie的读写操作示例详解

    cookie是一小段信息,以键/值对的信息保存在计算机硬盘上的字符串, cookie存储容量大概在4kb,不同的浏览器厂家对cookie大小的限制有微微的差异:cookie主要的本质是"识别",通过识别来做一些事情;cookie 也是无法从你的硬盘取得任何其它数据,传送电脑病毒或者获取你的电子邮件地址.cookie是有有效期的,cookie的默认有效期是从cookie生成至浏览器关闭,也可以通过设置cookie的有效期来指定其失效日期:用户也可以禁止cookie也可以手动删除cooki

  • Redis源码设计剖析之事件处理示例详解

    目录 1. Redis事件介绍 2. 事件的抽象 2.1 文件事件结构 2.2 时间事件结构 2.3 事件状态结构 3. 事件的实现 1. Redis事件介绍 Redis服务器是一个事件驱动程序,所谓事件驱动就是输入一条命令并且按下回车,然后消息被组装成Redis协议的格式发送给Redis服务器,这个时候就会产生一个事件,Redis服务器会接收改命令,处理该命令和发送回复,而当我们没有与服务器进行交互时,服务器就会处于阻塞等待状态,它会让出CPU然后进入睡眠状态,当事件触发时,就会被操作系统唤醒

随机推荐