Redis协议具体用法详解

前言

我们用过很多redis的客户端,有没有相过自己撸一个redis客户端?其实很简单,基于socket,监听6379端口,解析数据就可以了。

redis协议

解析数据的过程主要依赖于redis的协议了。我们写个简单例子看下redis的协议:

public class RedisTest {  public static void main(String[] args) {    Jedis jedis = new Jedis("127.0.0.1", 6379);    jedis.set("eat", "I want to eat");  }}

监听socket:

  public static void main(String[] args) throws IOException {    ServerSocket server = new ServerSocket(6379);    Socket socket = server.accept();    byte[] chars = new byte[64];    socket.getInputStream().read(chars);    System.out.println(new String(chars));  }

看下数据:

*3$3SET$3eat$13I want to eat

参照官方协议文档https://redis.io/topics/protocol,解析下数据。

(1)简单字符串 Simple Strings, 以 "+"加号 开头(2)错误 Errors, 以"-"减号 开头(3)整数型 Integer, 以 ":" 冒号开头(4)大字符串类型 Bulk Strings, 以 "$"美元符号开头,长度限制512M(5)组类型 Arrays,以 "*"星号开头并且,协议的每部分都是以 "\r\n" (CRLF) 结尾的。

所以上面的数据的含义是:

*3  数组包含3个元素,分别是SET、eat、I want to eat$3  是一个字符串,且字符串长度为3SET 字符串的内容$3  是一个字符串,且字符串长度为3eat 字符串的内容$13 是一个字符串,且字符串长度为13I want to eat 字符串的内容

执行get 'eat'的数据如下:

*2$3GET$3eat

撸一个客户端

掌握了redis协议,socket之后,我们就可以尝试撸一个客户端了。

socket:

public RedisClient(String host, int port){    try {      this.socket = new Socket(host,port);      this.outputStream = this.socket.getOutputStream();      this.inputStream = this.socket.getInputStream();    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }  }

set协议:

  public String set(final String key, String value) {    StringBuilder sb = new StringBuilder();    //虽然输出的时候,会被转义,然而我们传送的时候还是要带上\r\n    sb.append("*3").append("\r\n");    sb.append("$3").append("\r\n");    sb.append("SET").append("\r\n");    sb.append("$").append(key.length()).append("\r\n");    sb.append(key).append("\r\n");    sb.append("$").append(value.length()).append("\r\n");    sb.append(value).append("\r\n");    byte[] bytes= new byte[1024];    try {      outputStream.write(sb.toString().getBytes());      inputStream.read(bytes);    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }    return new String(bytes);  }

测试:

    RedisClient redisClient = new RedisClient("127.0.0.1", 6379);    String result = redisClient.set("eat", "please eat");    System.out.println(result);

执行结果:

+OK

更多Redis相关技术文章,请访问Redis教程栏目进行学习!

(0)

相关推荐

  • Redis协议具体用法详解

    前言 我们用过很多redis的客户端,有没有相过自己撸一个redis客户端?其实很简单,基于socket,监听6379端口,解析数据就可以了. redis协议 解析数据的过程主要依赖于redis的协议了.我们写个简单例子看下redis的协议: public class RedisTest { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.set(&qu

  • redis集群规范详解

    本文档翻译自 http://redis.io/topics/cluster-spec . 引言 这个文档是正在开发中的 Redis 集群功能的规范(specification)文档, 文档分为两个部分: 第一部分介绍目前已经在 unstable 分支中实现了的那些功能. 第二部分介绍目前仍未实现的那些功能. 文档各个部分的内容可能会随着集群功能的设计修改而发生改变, 其中, 未实现功能发生修改的几率比已实现功能发生修改的几率要高. 这个规范包含了编写客户端库(client library)所需的

  • JSP 中request与response的用法详解

    JSP 中request与response的用法详解 概要: 在学习这两个对象之前,我们应该已经有了http协议的基本了解了,如果不清楚http协议的可以看我的关于http协议的介绍.因为其实request和response的使用大部分都是对http协议的操作. request对象的介绍 我们先从request对象进行介绍: 我们知道http协议定义了请求服务器的格式: 请求行 请求头 空格 请求体(get请求没有请求体) 好了,这里我们就不详细介绍了,我们只看几个应用就可以了,没什么难度: 应

  • JSP中EL表达式的用法详解(必看篇)

    EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${为起始.以}为结尾的.上述EL范例的意思是:从Session的范围中,取得 用户的性别.假若依照之前JSP Scriptlet的写法如下: User user =(User)session.getAttribute("user"); String sex =user.getSex( );

  • Python3网络爬虫中的requests高级用法详解

    本节我们再来了解下 Requests 的一些高级用法,如文件上传,代理设置,Cookies 设置等等. 1. 文件上传 我们知道 Reqeuests 可以模拟提交一些数据,假如有的网站需要我们上传文件,我们同样可以利用它来上传,实现非常简单,实例如下: import requests files = {'file': open('favicon.ico', 'rb')} r = requests.post('http://httpbin.org/post', files=files) print

  • Django中的FBV和CBV用法详解

    FBV FBV,即 func base views,函数视图,在视图里使用函数处理请求. 以用户注册代码为例, 使用两个函数完成注册 初级注册代码 def register(request): """返回注册页面""" return render(request, "register.html") def register_handle(request): """进行注册处理""

  • Django中的session用法详解

    一.Session 的概念 cookie 是在浏览器端保存键值对数据,而 session 是在服务器端保存键值对数据 session 的使用依赖 cookie:在使用 Session 后,会在 Cookie 中存储一个 sessionid 的数据,每次请求时浏览器都会将这个数据发给服务器,服务器在接收到 sessionid 后,会根据这个值找出这个请求者的 Session. 二.Django 中 Session 的存储 session 键值对数据保存 session 的键值对数据默认保存在 dj

  • PHP7生产环境队列Beanstalkd用法详解

    应用场景 为什么要用呢,有什么好处?这应该放在最开头说,一件东西你只有了解它是干什么的,适合干什么,才能更好的与自己的项目相结合,用到哪里学到哪里,学了不用等于不会,我们平时就应该多考虑一些这样的问题:自己做个什么项目功能能跟 xx 技术相结合呢?这个 xx 技术放在这种业务场景下行不行呢?而不是 "学了这个 xx 技术能干嘛呢,公司现在也没有用这个的呀,学了也没用啊",带着这样心情去学习 xx 技术,肯定很痛苦. 队列大家都知道是将一些耗时的操作先不去做,先埋点,再异步去处理,这样对

  • ASP.NET Core中Cookie验证身份用法详解

    目录 添加配置 ASP.NETCore1.x ASP.NETCore2.x 创建身份认证Cookie ASP.NETCore1.x ASP.NETCore2.x Signingout(登出) ASP.NETCore1.x ASP.NETCore2.x 服务端变化反馈 ASP.NETCore1.x ASP.NETCore2.x Cookie设置选项 ASP.NETCore1.x ASP.NETCore2.x 持久Cookie ASP.NETCore1.x ASP.NETCore2.x 绝对到期时间

  • WinServer2012 Telnet配置和用法详解

    目录 引言 一.Telent配置过程 二.Telent用法 引言 搭建或配置网络环境时,经常会使用ping命令检查网络是否可达.有些时候Ping命令也不好使,比如因防火墙禁止或访问策略限制等,这时可以使用Telnet测试映射端口或远程连接主机,这个Telnet在Windows上是默认没有安装的. Telnet协议是TCP/IP协议族的其中之一,是Internet远程登录服务的标准协议和主要方式,常用于网页服务器的远程控制,可供使用者在本地主机运行远程主机上的工作. 一.Telent配置过程 1.

随机推荐