漫游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 的简单实用。






版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

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

Unity3d中场景漫游的制作
  • book_longssl
  • book_longssl
  • 2014年09月09日 09:50
  • 3092

全景虚拟漫游实现(three.js)

全景虚拟漫游其实看到很多例子,比如地图上的全景,校园的全景,之前在朋友圈流行转发的公司全景。但真的想起来要去研究或者实现一下,是前几日说工作上可能会有这样的一个需求。觉悟来得太晚,好奇心也不够重,这么...
  • fen747042796
  • fen747042796
  • 2017年02月14日 17:47
  • 1205

GSM数字移动通信国际漫游的实现

  • 2013年07月09日 13:25
  • 7KB
  • 下载

移动通信的语音与数据漫游

作者:匿名用户 链接:https://www.zhihu.com/question/21082982/answer/25474780 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 先说说什...
  • achejq
  • achejq
  • 2016年07月22日 14:28
  • 1812

基于匿名身份认证的漫游通信协议

  • 2015年03月15日 21:18
  • 1.05MB
  • 下载

redis-cluster核心原理分析:gossip通信、jedis smart定位、主备切换

1、节点间的内部通信机制1.1 基础通信原理 redis cluster节点间采取gossip协议进行通信 维护集群的元数据有两种方式:集中式和gossip 集中式: 优点在于元数据的更新和读取...
  • R_P_J
  • R_P_J
  • 2017年12月15日 15:02
  • 94

Jedis - Redis通信协议

package redis.clients.jedis; import java.io.IOException; import java.util.ArrayList; import java.ut...
  • xiaojia1100
  • xiaojia1100
  • 2015年08月01日 13:09
  • 1259

使用MO实现的前后视图,缩放,漫游等功能

  • 2014年11月21日 04:19
  • 274KB
  • 下载

用OpenGL实现虚拟场景漫游

  • 2012年05月11日 17:57
  • 842KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:漫游jedis-RESP通信实现
举报原因:
原因补充:

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