幸运蛋蛋pc开奖
在本篇文章中小编给大家整理了关于Redis协议具体用法以及相关内容知识点,需要的朋友们学习下。

前言

我们用过很多redis的客户端,有没有相过自己撸一个redis客户端?#31185;?#23454;很简单,基于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教程栏目进行学习!

最新资讯
口碑饿了么:“三个100万”提前实现 数字化成关键词

口碑饿了么:“三个100

阿里巴巴2019年全球投资者大会上,口碑饿了么透露,年初启
贾?#23601;?#26132;日伙伴韬蕴资本代持“罗生门”

贾?#23601;?#26132;日伙伴韬蕴资

是韬蕴资本挪用了?#24335;穡?#20266;造了公章?曾经系供销大集第三大
小?#33258;?#24230;回购1074万股股份 耗?#24335;?亿港元

小?#33258;?#24230;回购1074万股

小米集团日前对外发布公告称,9月23日再次回购1074万股,
康泰纳仕中国声明?#20309;?#21457;现?#24179;?#26377;任何违规行为

康泰纳仕中国声明?#20309;?#21457;

针对收到“康泰纳仕普通的员工”的匿名邮件这一事件,康
品钛?#20064;?#24180;净利润1.032亿元 同比增长218%

品钛?#20064;?#24180;净利润1.03

中国金融科技解决方案提供?#21776;?#38043;今日发布了截至6月30
面临巨亏和用工法案重压 Uber想借货“运”来盈利?

面临巨亏和用工法案重

Uber不仅在近期面临?#20013;?#20111;损的阴霾,更为窘迫的是,9月10
最新文章
安装redis(windows和Ubuntu)详解

安装redis(windows和Ub

这篇文章主要介绍了Redis在Ubuntu和Windows下的安装,文
Redis字符串对象实用笔记

Redis字符串对象实用

这篇文章主要给大家介绍了关于Redis字符串对象的相关
Redis精确去重计数方法(咆哮位图)

Redis精确去重计数方

这篇文章主要给大家介绍了关于Redis精确去重计数方法(
在Redis集群中使用pipeline批量插入的实现方法

在Redis集群中使用pip

这篇文章主要介绍了在Redis集群中使用pipeline批量插
Redis实战记录之限制操作频率

Redis实战记录之限制

这篇文章主要给大家介绍了关于Redis实战记录之限制操
redis中热key问题该如何解决

redis中热key问题该如

这篇文章主要给大家介绍了关于redis中热key问题该如何
幸运蛋蛋pc开奖 广西快3三同号推荐 山东时时十一选五 河南快三手机版 今日赛事直播 vr赛网站 云南快乐十分遗漏 22选5第111期开奖结果 中彩网擂台赛电脑版 四川福彩快乐12 黑龙江时时jiq