手写redis客户端
一、RESP通信协议
Redis Serialization Protocol (Redis序列化协议).
特点:容易实现、解析快、可读性强
以\r\n分割数据.
二、撸代码
package com.dongnao.demo; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket; /**
* Created by crescendo.tian on 2018/8/27.
*/
public class TqRedis { private Socket socket;
private OutputStream write;
private InputStream read; public TqRedis(String host, int port) throws IOException {
socket = new Socket(host, port);
} public void set(String key, String val) throws IOException {
StringBuffer sb = new StringBuffer();
sb.append("*3").append("\r\n");//代表3个参数
sb.append("$3").append("\r\n");//第一个参数的长度
sb.append("SET").append("\r\n");//第一个参数的内容 sb.append("$").append(key.getBytes().length).append("\r\n");//第二个参数长度
sb.append(key).append("\r\n");//第二个参数内容 sb.append("$").append(val.getBytes().length).append("\r\n");//第三个参数长度
sb.append(val).append("\r\n");//第三个参数内容 write.write(sb.toString().getBytes());
byte[] bytes = new byte[1024];
read.read(bytes);
System.out.println("set---------------------------------------------");
System.out.println(new String(bytes));
} public void get(String key) throws IOException {
StringBuffer sb = new StringBuffer();
sb.append("*2").append("\r\n");//代表2个参数
sb.append("$3").append("\r\n");//第一个参数长度
sb.append("GET").append("\r\n");//第一个参数的内容 sb.append("$").append(key.getBytes().length).append("\r\n");//第二个参数长度
sb.append(key).append("\r\n");//第二个参数内容 write.write(sb.toString().getBytes());
byte[] bytes = new byte[1024];
read.read(bytes);
System.out.println("get---------------------------------------------");
System.out.println(new String(bytes));
} public static void main(String[] args) throws IOException {
TqRedis jedis = new TqRedis("127.0.0.1", 6379);
jedis.set("test", "001");
jedis.get("test");
} }
三、引用
https://www.jianshu.com/p/c0c18f9f5494
手写redis客户端的更多相关文章
- 用C、python手写redis客户端,兼容redis集群 (-MOVED和-ASK),快速搭建redis集群
想没想过,自己写一个redis客户端,是不是很难呢? 其实,并不是特别难. 首先,要知道redis服务端用的通信协议,建议直接去官网看,博客啥的其实也是从官网摘抄的,或者从其他博客抄的(忽略). 协议 ...
- 从零开始写redis客户端(deerlet-redis-client)之路——第一个纠结很久的问题,restore引发的血案
引言 正如之前的一篇博文,LZ最近正在从零开始写一个redis的客户端,主要目的是为了更加深入的了解redis,当然了,LZ也希望deerlet客户端有一天能有一席之地.在写的过程当中,LZ遇到了一个 ...
- 使用java语言基于SMTP协议手写邮件客户端
使用java语言基于SMTP协议手写邮件客户端 1. 说明 电子邮件是互联网上常见的应用,他是互联网早期的产品,直至今日依然受到广大用户的喜爱(在中国可能因为文化背景不同,电子邮件只在办公的时候常用) ...
- C基础 带你手写 redis sds
前言 - Simple Dynamic Strings antirez 想统一 Redis,Disque,Hiredis 项目中 SDS 代码, 因此构建了这个项目 https://github.c ...
- C基础 带你手写 redis adlist 双向链表
引言 - 导航栏目 有些朋友可能对 redis 充满着数不尽的求知欲, 也许是 redis 属于工作, 交流(面试)的大头戏, 不得不 ... 而自己当下对于 redis 只是停留在会用层面, 细节层 ...
- 自己动手写Redis客户端- Redis协议(1)
网络层 客户端和服务器通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 . 客户端和服务器发送的命令或数据一律以 \r\n (CRLF)结尾. 请求 Redis 服务器接受命令以及命 ...
- C基础 带你手写 redis ae 事件驱动模型
引言 - 整体认识 redis ae 事件驱动模型, 网上聊得很多. 但当你仔细看完一篇又一篇之后, 可能你看的很舒服, 但对于 作者为什么要这么写, 出发点, 好处, 缺点 ... 可能还是好模糊, ...
- 关于布隆过滤器,手写你真的知其原理吗?让我来带你手写redis布隆过滤器。
说到布隆过滤器不得不提到,redis, redis作为现在主流的nosql数据库,备受瞩目:它的丰富的value类型,以及它的偏向计算向数据移动属性减少IO的成本问题.备受开发人员的青睐.通常我们使用 ...
- 手写redis的docker文件,通过docker-compose配置redis
在前面一遍随笔,配置的是mysql主从的docker-compose配置.今天我们来学习配置编排容器redis. 准备环境: docker 18.06.1-ce docker-compose 1.23 ...
随机推荐
- Python-网络编程(一)
首先我们python基础部分已经学完了,而socket是我们基础进阶的课程,也就是说,你自己现在完全可以写一些小程序了,但是前面的学习和练习,我们写的代码都是在自己的电脑上运行的,虽然我们学过了模块引 ...
- 两种实现光标点插入range
一.insertNode <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- php接收post过来的json数据
<html> <head> <title>json</title> <script src="//cdn.bootcss.com/jqu ...
- 使用spring tool suite(STS)工具创建spring boot项目和出现错误后的处理
一.先下载配置maven环境 1.下载地址:http://maven.apache.org/download.cgi windows下下载zip文件 2.解压后放到某个文件目录下 3.配置环境变量 ( ...
- 浅谈回归(二)——Regression 之历史错误翻译
我很好奇这个问题,于是搜了一下.我发现 Regression 这个词 本意里有"衰退"的意思. 词根词缀: re- 回 , 向后 + -gress- 步 , 级 + -ion 名词 ...
- 关于YARN的基本结构
- Android之自定义View以及画一个时钟
https://www.2cto.com/kf/201509/443112.html 概述: 当Android自带的View满足不了开发者时,自定义View就发挥了很好的作用.建立一个自定义View, ...
- web项目开发流程
对于一个web项目,在实际编码之前,有一些通用的步骤来planning a website: 0.Defining the project (predr0->dr0) 对于外部项目,客户一般会发 ...
- linux下查看某个文件属于哪个包
1.centos/redhat下查看某个文件或命令属于哪个rpm包: $ yum provides /etc/passwd 或者 $ rpm -qf /etc/passwd 2.ubuntu及衍生版: ...
- shell逻辑运算符 1
逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测『档案』是否存在 eg: if [ -f filename ] -d 常用!侦测『目录』是否存在 -b 侦测是否为一个『 bl ...