漫游jedis-RESP通信实现

原创 2017年11月04日 17:09:53

Redis 客户端与服务器之间的通讯使用的协议Redis Serialization Protocol,简称RESP。

insight jedis核心功能:RESP通信实现。

1. 通信实现 (redis.clients.jedis.Connection);

2. RESP协议实现 (redis.clients.jedis.Protocol, redis.clients.util.RedisOutputStream, redis.clients.util.RedisInputStream)


jedis 通信实现(典型的socket 编程template):

/**
 * jedis执行命令的典型模板
 * 1. check
 * 2. send command
 * 3. recive result
 **/
public String set(final String key, String value) {
    checkIsInMultiOrPipeline();
    // 
    client.set(key, value);
    return client.getStatusCodeReply();
}

// 客户端command + arguments 发送的实现
protected Connection sendCommand(final Command cmd, final byte[]... args) {
    try {
        // 主动check connection,兼容socket初始化过程,常用的做法
        connect();
        // 根据RESP,请求信息以字节码写入os
        Protocol.sendCommand(outputStream, cmd, args);
        pipelinedCommands++;
        return this;
    } catch (JedisConnectionException ex) {
        // 即使报错,在断开连接前,得到server 的报错信息
        // ...
        // 关键标识
        broken = true;
        throw ex;
    }
}

RESP协议实现

首先,了解协议内容: https://redis.io/topics/protocol#resp-protocol-description

特点: 实现简单、解析快速、可读性强。

然后,insight:

/**
 * 典型的协议编码实现
 * 
 * 支持的数据类型: Simple Strings, Errors, Integers, Bulk Strings and Arrays.
 * 数据类型的表示:Simple Strings(+), Errors, Integers(:), Bulk Strings($) and Arrays(*)
 * 不同的块之间一定要用CRLF间隔(\r\n)
 **/
private static void sendCommand(final RedisOutputStream os, final byte[] command, final byte[]... args) {
    try {
        os.write(ASTERISK_BYTE);// * 我是数组
        os.writeIntCrLf(args.length + 1);// 命令1 + 参数n
        os.write(DOLLAR_BYTE);// $
        os.writeIntCrLf(command.length);// 长度
        os.write(command);// 操作命令
        os.writeCrLf();// 间隔符号
        
        for (final byte[] arg : args) {// 追加入参
            os.write(DOLLAR_BYTE);
            os.writeIntCrLf(arg.length);
            os.write(arg);
            os.writeCrLf();
        }
    } catch (IOException e) {
        throw new JedisConnectionException(e);
    }
}


总结:通信必用socket,jedis 简洁的实现RESP 协议完成与服务的通信,值得借鉴。

后续会Insight pool 的简单实用。






版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tt50335971/article/details/78444270

移动IP与通信漫游

一直带着一部在江苏办理的合约机在北京上学,遇到过诸多不便。 最近一边复习计算机网络,一边在学TCP/IP协议,正好看到移动IP这一块,理通了心中的疑惑,这里跟大家分享一下。什么是移动IP?移动IP技...
  • gzxultra
  • gzxultra
  • 2015-05-11 21:17:07
  • 542

(通俗版)手机漫游的实现原理

游具体咋回事(通俗版本): 你带着SIM卡归属区域为成都的肾6去帝都……...
  • u012462927
  • u012462927
  • 2016-06-24 21:42:01
  • 3020

不同业务VLAN的AP间漫游

不同业务VLAN的AP间漫游 类似于有线局域网,为了避免广播风暴,企业内部的WLAN网络也会根据楼层、部门等将不同用户群划分到不同VLAN。假设不同楼层部署的AP所属VLAN不同,当用户...
  • hanyingzhong
  • hanyingzhong
  • 2014-08-27 10:30:55
  • 2156

Unity3D键盘+鼠标漫游脚本

两个代码都附在MainCamera上面,可以实现键盘加鼠标漫游 1、KeyMove.cs  键盘漫游 using UnityEngine; using System.Collect...
  • u013692049
  • u013692049
  • 2016-10-30 21:39:45
  • 2071

Unity中关于场景漫游的两个方法(二)

第二个方法不仅不需要借助漫游插件实现漫游效果,而且还可以实现对物体的抓取,比第一种方法更加方便快捷。废话不多说,下面进入正题: 导入steamVR Plugin插件 steamVR Plugin可...
  • a435931517
  • a435931517
  • 2017-08-29 17:52:26
  • 971

three.js 实现3D漫游

three.js webgl - equirectangular panorama
  • qq_33988065
  • qq_33988065
  • 2017-04-01 15:31:05
  • 1102

Unity3d游戏开发之漫游场景的制作

Unity3d中场景漫游的制作
  • book_longssl
  • book_longssl
  • 2014-09-09 09:50:32
  • 3287

多无线AP用中继方式实现漫游

多无线AP用中继方式实现漫游(伪/有缝) 无线网络信号覆盖范围较大,单个无线路由器无法满足覆盖需求,可以采用从路由器中继主路由器的信号解决。 从路由器只需连接电源,无需接网线。 家用路由器只能实现...
  • rockwzy
  • rockwzy
  • 2016-05-27 23:48:43
  • 1755

使用DirectX大场景漫游

  • 2014年11月29日 21:20
  • 10.59MB
  • 下载

Unity C#脚本实现的相机漫游…

转载请注明出处http://blog.sina.com.cn/u/1580340211 最近总监把之前的项目导出发现有相机乱晃动的情况,后来发现竟然是Unity版本的问题,之前的3.5的版本导入到4...
  • iloveayu
  • iloveayu
  • 2017-08-05 17:43:33
  • 303
收藏助手
不良信息举报
您举报文章:漫游jedis-RESP通信实现
举报原因:
原因补充:

(最多只允许输入30个字)