首页 > 编程知识 正文

将redis注册为本地服务,java嵌入式redis

时间:2023-05-05 06:34:32 阅读:32844 作者:3456

默认情况下,redis服务使用端口6379与外部进行通信,但实际上您可以自行实现简单的redis客户端。 这里用java来实现吧。

要实现一个redis客户端,主要需要实现两个部分

套接字通信redis通信协议(resp协议)的编码和解密主要是第二部分resp的实现。 这里首先简单说明一下resp。RESP 协议简介

在Redis客户端和服务端之间,作为进行通信的标准方法,在TCP协议的上层采用了名为resp (redisserialization protocol,分布式协议)的独立协议。

Redis协议在以下方面进行了权衡:

轻松实现

它会在计算机上被快速分析

可以简单地人工分析

新的集成协议是在Redis 1.2中引入的,但Redis 2.0已成为与Redis服务通信的标准方法。 在此集成协议中,发送到Redis服务端的所有参数都是二进制安全的。 Redis以不同的回复类型回复命令。它可以从服务器发送的第一个字节开始校验回复类型:

单行回复(单行字符串回复)的回复的第一个字节为“”

错误消息(单行字符串回复的另一种显示格式),回复的第一个字节为“-”

整数回复(正整形数字回复)的回复的第一个字节为“:”

批量回复(多行字符串回复(回复的第一个字节为" $ "

对于多个批量回复(数组回复),回复的第一个字节为“*”

在此举个例子,例如,命令set name ldh实际上是数组,由resp编码的结果

*3//3表示数组长度为3$3//3,字符串长度set$4name$3ldh服务器返回的OK实际上是OK。 简单来说,encode和decode函数的定义如下

//编码、['set '、' name '、' LDH ' ]-*3 rn $3 rnsetn $4 rnamern $3 rr

byte[]encode(string[]commands ) stringbuilder stringbuilder=new stringbuilder ); stringbuilder.append('* ' ).append (commands.length ).append )rn ); for (string command 3360 commands (stringbuilder.append (' $ '.append ) command.length ) ).append )r (n stringbu n bu n } return stringBuilder.toString ().getBytes ); }然后,创建一个简单的套接字客户端,并使用上面的编码函数进行编码。 请注意,这里会阻止Java套接字的read方法。 因此,读取操作独立于一个线程进行。 所有代码如下所示

公共类测试{ publicstaticvoidmain (字符串[ ] args ) try ) scannerin=newscanner ) system.in ); socketsocket=new socket (' 127.0.0.1 ',6379 ); output stream output stream=socket.get output stream (; inputstream inputstream=socket.get inputstream (; bufferedreaderbufferedreader=newbufferedreader (newinputstreamreader ) inputstream ); while(in.Hasnext () ({ String str=in.nextLine ) ); String[] command=str.split (' '; output stream.write (编码(命令); outputStream.flush (; 新读取(新读取)缓冲读取程序).start ); }catch(exceptione ) { e.printStackTrace ); } static byte [ ] encode (string [ ] commands ) stringbuilder stringbuilder=new stringbuilder ); stringbuilder.append('* ' ).append (commands.length ).append )rn ); for (string command 3360 commands (stringbuilder.append (' $ '.append ) command.length ) ).append )r (n stringbu n bu n } system.out.println (stringbuilder ); return stringBuilder.toString ().getBytes ); } classreadimplementsrunnable { bufferedreaderbufferedreader; 读(bufferedreaderbufferedreader (this.buffered reader=buffered reader; } @ sneaky throws @ overridepublicvoidrun ((stringinfo; while ((info=buffered reader.readline ) )!=null(system.out.println(info ) ); }然后,我们启动redis服务器,填写redis服务器的ip和端口,运行我们的函数,在这里我将填写名为set name ldh的命令。 之后,get name

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。