resp 协议主要是方便使用redis 客户端进行连接,resp 主要是依赖 tidwall/redcon golang redis 协议包

resp 服务说明

server_resp.go 文件,干的事情比较简单,就是redis command 的支持,包含了几个内置的
ping select help quit echo, 以及宏相关的list 以及宏调用的command

代码

server_resp.go

  • 注册redis 协议服务
 
func initRESPServer() error {
  return redcon.ListenAndServe(
    *flagRESPListenAddr,
    func(conn redcon.Conn, cmd redcon.Command) {
      // handles any panic
      defer (func() {
        if err := recover(); err != nil {
          conn.WriteError(fmt.Sprintf("fatal error: %s", (err.(error)).Error()))
        }
      })()
 
 
  • 协议解析
    内置协议的处理help echo ping 。。。
    比较简单,就是写数据,都是字符串类型的
 
// internal command to pick a database
      if todoNormalized == "select" {
        conn.WriteString("OK")
        return
      }
      // internal ping-pong
      if todoNormalized == "ping" {
        conn.WriteString("PONG")
        return
      }
      // ECHO <args ...>
      if todoNormalized == "echo" {
        conn.WriteString(strings.Join(args, " "))
        return
      }
 
 

宏调用
list command 命令,主要是调用macrosManager 的list 方便,返回宏的列表

 
// HELP|INFO|LIST
      if todoNormalized == "list" || todoNormalized == "help" || todoNormalized == "info" {
        conn.WriteArray(macrosManager.Size())
        for _, v := range macrosManager.List() {
          conn.WriteBulkString(v)
        }
      }
 
 

宏方便指定
核心是commandExecMacro

 
macro := macrosManager.Get(todo)
      if nil == macro {
        conn.WriteError("not found")
        conn.Close()
        return
      }
      var input map[string]interface{}
      if len(args) > 0 {
        json.Unmarshal([]byte(args[0]), &input)
      }
      // handle our command
      commandExecMacro(conn, macro, input)
 
 

commandExecMacro 方法如下:

func commandExecMacro(conn redcon.Conn, macro *Macro, input map[string]interface{}) {
  // 调用macro 的call,call 包含了宏生命周期中的处理,注意input 数据是一个json 对象数据,所以通过
  redis 客户端调用宏的时候数据需要json 序列化
  out, err := macro.Call(input)
  if err != nil {
    conn.WriteArray(2)
    conn.WriteInt(0)
    j, _ := json.Marshal(err.Error())
    conn.WriteBulk(j)
    return
  }
  jsonOUT, _ := json.Marshal(out)
  conn.WriteArray(2)
  conn.WriteInt(1)
  conn.WriteBulk(jsonOUT)
}
 
 

参考资料

https://github.com/tidwall/redcon
https://github.com/alash3al/sqler/blob/master/server_resp.go

sqler sql 转rest api 源码解析(二) resp 协议的更多相关文章

  1. sqler sql 转rest api 源码解析(一)应用的启动入口

    sqler sql 转rest api 的源码还是比较简单的,没有比较复杂的设计,大部分都是基于开源 模块实现的. 说明: 当前的版本为2.0,代码使用go mod 进行包管理,如果本地运行注意gol ...

  2. sqler sql 转rest api 源码解析(四)macro 的执行

    macro 说明 macro 是sqler 的核心,当前的处理流程为授权处理,数据校验,依赖执行(include),聚合处理,数据转换 处理,sql 执行以及sql 参数绑定 授权处理 这个是通过go ...

  3. sqler sql 转rest api 源码解析(三) rest协议

    rest 服务说明 rest 协议主要是将配置文件中的宏暴露为rest 接口,使用了labstack/echo web 框架,同时基于context 模型 进行宏管理对象的共享,同时进行了一些中间件的 ...

  4. Mybatis源码解析(二) —— 加载 Configuration

    Mybatis源码解析(二) -- 加载 Configuration    正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...

  5. RxJava2源码解析(二)

    title: RxJava2源码解析(二) categories: 源码解析 tags: 源码解析 rxJava2 前言 本篇主要解析RxJava的线程切换的原理实现 subscribeOn 首先, ...

  6. Sentinel源码解析二(Slot总览)

    写在前面 本文继续来分析Sentinel的源码,上篇文章对Sentinel的调用过程做了深入分析,主要涉及到了两个概念:插槽链和Node节点.那么接下来我们就根据插槽链的调用关系来依次分析每个插槽(s ...

  7. jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究

    终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...

  8. Common.Logging源码解析二

    Common.Logging源码解析一分析了LogManager主入口的整个逻辑,其中第二步生成日志实例工厂类接口分析的很模糊,本随笔将会详细讲解整个日志实例工厂类接口的生成过程! (1).关于如何生 ...

  9. erlang下lists模块sort(排序)方法源码解析(二)

    上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...

随机推荐

  1. 内存管理和GC算法以及回收策略

    JVM内存组成结构 JVM栈由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: JVM内存回收 Sun的JVMGenerationalCollecting(垃圾回收)原理是这样的:把对象分为年青 ...

  2. Ubuntu server 网络配置中遇到的问题

    Ubuntu server 网络配置中遇到的问题 图片中ip地址有可能和文字不符,请不要在意太多,知道原理即可 - 1.首先就是要配置ip地址 vim /etc/network/interfaces ...

  3. VSTO:使用C#开发Excel、Word【1】

    <Visual Studio Tools for Office: Using C# with Excel, Word, Outlook, and InfoPath >——By Eric C ...

  4. update-alternatives关键解疑

    update-alternatives的用法网上到处又有,但有2个知识点好像都没怎么提到: 1.--install 里的参数link到底是啥意思,其实update-alternatives本质就是在/ ...

  5. 安装连接mysql8时候遇到的问题以及解决(转)

    官网下载mysql8的安装包: https://dev.mysql.com/downloads/ 下一步安装即可. mysql8增加了传说中的安全性校验 遇到的几个问题: 1.natcat连接不上.参 ...

  6. Effective Java通用设计

    将局部变量作用域最小化 将变量一开始就声明在头是十分不明智的选择,局部变量最好是在初始使用的时候才声明,而且尽量给定一个值,好处有三,一是容易读程序,二在对应的语句块使用,可以节省开销,三因为在对应的 ...

  7. libusb 终于搞好了

  8. 利用python实现电影推荐

    "协同过滤"是推荐系统中的常用技术,按照分析维度的不同可实现"基于用户"和"基于产品"的推荐. 以下是利用python实现电影推荐的具体方法 ...

  9. [转载] About Career Promotion and Tutoring from Zhihu Web FAQer (Quoted Entirely Without Personal Idea. Delete Immediately If Pirated)

    问题: 如何下列各类公司的互联网IT类工作待遇排名? 下列各公司岗位待遇序号从小到大依次降低: 美国互联网总部special offer(15万刀起薪) : 股份制银行总行,证券公司,基金公司IT部门 ...

  10. 【tomcat】启动报错:Failed to initialize end point associated with ProtocolHandler ["http-apr-8080"] java.lang.Exception: Socket bind failed 和java.net.BindException: Address already in use: JVM_Bind错误解决

    背景:[新手] 将开发机子上的Tomcat连同其中的项目,一起拷贝到服务器上,启动tomcat的start.bat,然后报错如下: 问题1: Failed to initialize end poin ...