概述

Redis是开源的、基于内存的数据结构存储系统,可用作数据库、缓存以及消息代理方面。Redis支持许多种数据结构,并内置了丰富的诸如冗余、脚本、事务、持久化等功能,深受业界喜爱,被各种业务系统广泛使用。为了方便使用,Redis官网推荐了针对各种编程语言的多种客户端,支持java、c#、python、c++等主流编程语言。那么大家会问,既然Redis客户端已经这么丰富了,为什么还要尝试自己编写客户端?我的看法是,知己知彼,自己尝试制作Redis客户端,不仅可以加深对Redis的了解,而且可以通晓Redis客户端的原理,为今后的更好地使用、乃至定制改造Redis作好充分准备。

知识准备

要想亲自开发Redis客户端,需要以下知识:

1、网络编程基础

2、熟悉Redis协议

3、了解Redis的基本操作

另外文中的例子将会采用java编写,因此最好有基本的java编程知识。

面向对象

Redis Protocal

Redis协议被称为:RESP (REdis Serialization Protocol),客户端通过TCP协议连接到客户端的6379端口(默认端口)。

RESP协议是在Redis1.2中引入的,不过现在已经是Redis2.0中的标准协议了。所以你应该再Redis客户端中实现这个协议。

RESP描述

RESP其实是一个序列化协议,支持简单字符串、错误、整数、整块字符串和数组。数据类型依赖头文字,分别表示如下:

简单字符串的头文字是“+”

错误的头文字是“-”

整数的头文字是“:”

整块字符串的头文字是“$”

数组的头文字是“*”

RESP在请求-响应模型中的用法

-客户端向Redis服务器发送命令,命令的格式是仅以RESP整块字符串构成的数组。。

-服务器端根据命令的结果,选择适宜的一种RESP类型返回

简单字符串

简单字符串是以半角加号开头,后跟随着不含回车换行的字符串,然后以回车换行结尾。

举例如下:+OK\r\n

简单字符串是非二进制安全的,如果需要二进制安全,可使用“整块字符串”。

错误

错误和简单字符串类似,但头文字换成半角减号了。后面跟随的文字,可以视为错误消息内容。

举例如下:

-ERR unknown command 'foobar'
-WRONGTYPE Operation against a key holding the wrong kind of value

整数

整数与简单字符串类似,头文字为半角冒号。

举例如下:

:0\r\n
:1000\r\n

整块字符串

整块字符串可以用来标示二进制安全的、最大512MB长度的字符串。它以$符号开头,后跟随实际字符串长度,以回车换行结尾,后跟随实际字符串,再最终以回车换行结尾。

举例如下:

$6\r\nfoobar\r\n
空字符串表现形式如下:$0\r\n\r\n
nil表现形式如下:$-1\r\n\r\n

数组

数组以半角星号开头,后接数组中元素个数,然后以回车换行结尾,然后后接各个元素。

举例如下:

空数组:*0\r\n
包含两个整块字符串的数组:*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n
包含三个整数的数组:*3\r\n:1\r\n:2\r\n:3\r\n

Redis客户端代码实现

要实现和Redis服务端通信,首先需要与Redis服务端建立TCP通信连接,然后使用上述的RESP协议,将想要执行的Redis命令发送至服务端,并等待服务端响应,然后接收到响应结果,展示给用户。

以下代码实现了一个简单的获取info的操作。

public class App
{
    public static void main( String[] args )
    {
        //定义redis服务端默认端口
        int port = 6379;

        Socket socket = null;
        BufferedReader in = null;
        PrintWriter out = null;

        try {
            //创建tcp连接
            socket = new Socket("localhost", port);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);

            //传送info命令
            //客户端向Redis服务器发送命令,以RESP整块字符串数组的形式
            out.println("*1\r\n$4\r\ninfo\r\n");
            System.out.println("Redis command wat sent successfully.");

            //接收服务器的回复
            CharBuffer response = CharBuffer.allocate(1024);
            int readedLen = in.read(response);
            String responseBody = response.flip().toString();

            //输出服务器的回复
            System.out.println(responseBody);

        }
        catch(Exception e) {
            e.printStackTrace();
        }
        finally {
            //最后关闭相关的流
            if (out != null){
                out.close();
                out = null;
            }

            if (in != null) {
                try {
                    in.close();
                }
                catch(IOException e){
                    e.printStackTrace();
                }

                in = null;
            }

            if (socket != null) {
                try {
                    socket.close();
                }
                catch(IOException e){
                    e.printStackTrace();
                }

                socket = null;
            }
        }
    }
}

运行后,系统将会在命令行界面输出info的执行结果。

如何编写入门级redis客户端的更多相关文章

  1. 测试平台系列(80) 封装Redis客户端

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们编写了Redis ...

  2. 一文彻底理解Redis序列化协议,你也可以编写Redis客户端

    前提 最近学习Netty的时候想做一个基于Redis服务协议的编码解码模块,过程中顺便阅读了Redis服务序列化协议RESP,结合自己的理解对文档进行了翻译并且简单实现了RESP基于Java语言的解析 ...

  3. spring整合redis客户端及缓存接口设计(转)

    一.写在前面 缓存作为系统性能优化的一大杀手锏,几乎在每个系统或多或少的用到缓存.有的使用本地内存作为缓存,有的使用本地硬盘作为缓存,有的使用缓存服务器.但是无论使用哪种缓存,接口中的方法都是差不多. ...

  4. Netty开发redis客户端,Netty发送redis命令,netty解析redis消息

    关键字:Netty开发redis客户端,Netty发送redis命令,netty解析redis消息, netty redis ,redis RESP协议.redis客户端,netty redis协议 ...

  5. spring整合redis客户端及缓存接口设计

    一.写在前面 缓存作为系统性能优化的一大杀手锏,几乎在每个系统或多或少的用到缓存.有的使用本地内存作为缓存,有的使用本地硬盘作为缓存,有的使用缓存服务器.但是无论使用哪种缓存,接口中的方法都是差不多. ...

  6. Redis客户端、服务端的安装以及命令操作

    目的: redis简介 redis服务端安装 redis客户端安装 redis相关命令操作 redis简介 官网下载(https://redis.io/) Redis 是完全开源免费的,遵守BSD协议 ...

  7. Redis客户端相关

    1.redis是什么 redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库.redis的官网地址,非常好记,是redis.io.目前,Vmware在 ...

  8. Redis 客户端 Jedis、lettuce 和 Redisson 对比

    Redis 支持多种语言的客户端,下面列举了部分 Redis 支持的客户端语言,大家可以通过官网查看 Redis 支持的客户端详情. C语言 C++ C# Java Python Node.js PH ...

  9. Golang 实现 Redis(6): 实现 pipeline 模式的 redis 客户端

    本文是使用 golang 实现 redis 系列的第六篇, 将介绍如何实现一个 Pipeline 模式的 Redis 客户端. 本文的完整代码在Github:Godis/redis/client 通常 ...

随机推荐

  1. 电力 Web SCADA 工控组态编辑器

    前言 SVG 并非仅仅是一种图像格式, 由于它是一种基于 XML 的语言,也就意味着它继承了 XML 的跨平台性和可扩展性,从而在图形可重用性上迈出了一大步.如 SVG 可以内嵌于其他的 XML 文档 ...

  2. 小工具:批量导入导出主机上的docker镜像

    工作需要,将主机上的部分镜像导出为tar文件,放便在其他主机上使用 用python实现了一个批量打包脚本: import re import os import subprocess if __nam ...

  3. Anaconda入门安装教程

    Anaconda 是什么? Anaconda 是一个可用于科学计算的 Python 发行版,支持 Linux.Mac.Windows系统,内置了常用的科学计算包.它解决了官方 Python 的两大痛点 ...

  4. [USACO 06NOV]Corn Fields

    Description 题库链接 给你一个 \(0,1\) 矩阵,只准你在 \(1\) 上放物品:并且要满足物品不能相邻.允许空放,问方案数,取模. \(1\leq n,m\leq 12\) Solu ...

  5. [HNOI 2015]实验比较

    Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ...

  6. SAC E#1 - 一道中档题 Factorial

    题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SOL菌表示不服 ...

  7. 【BZOJ1040】【ZJOI2008】骑士

    Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战 ...

  8. [洛谷]P3729 曼哈顿计划EX(最小割树/等价流树)

    题目大意:给出一张n个点m条边的无向图,每个点有点权,q次询问,每次给出k,要求选出若干个点点权之和不小于k,求一个最大的值x,使得选出的点中任意两点之间至少有x条互不相交的链.(n<=550, ...

  9. ●POJ 2007 Scrambled Polygon

    题链: http://poj.org/problem?id=2007 题解: 计算几何,极角排序 按样例来说,应该就是要把凸包上的i点按 第三像限-第四像限-第一像限-第二像限 的顺序输出. 按 叉积 ...

  10. BZOJ3810: [Coci2015]Stanovi

    3810: [Coci2015]Stanovi Description Input 输入一行,三个整数,n, m, k   Output 输出一个数,表示最小不满意度.   Sample Input ...