实现一个简单的redis-client

redis通信原理

redis客户端与服务端之间使用tcp进行通信,redis客户端每执行一条命令,都会将命令封装成特定的格式传送到服务端,

如果我们需要实现redis客户端,就需要完成请求的封装。

如果我们打开redis的aof文件,经常会看到类似于下面这样的内容,这实际上就是客户端发送给服务端的数据格式

下面用java实现一个简单的拥有set、get方法的redis客户端,网络编程使用socket,具体代码如下所示:

public class RedisClient {

    private InputStream inputStream;

    private OutputStream outputStream;

    public RedisClient(String host, int port) throws IOException {
        Socket socket = new Socket(host, port);
        inputStream = socket.getInputStream();
        outputStream = socket.getOutputStream();
    }

    public String get(String key) throws IOException {
        byte[] result = new byte[1024];
        //封装数据
        StringBuilder data = new StringBuilder();

        //命令参数个数
        data.append("*2").append("\r\n");

        data.append("$3").append("\r\n");
        data.append("GET").append("\r\n");
        //key字节长度
        data.append("$").append(key.getBytes().length).append("\r\n");
        data.append(key).append("\r\n");

        outputStream.write(data.toString().getBytes());

        inputStream.read(result);

        String[] values = new String(result).split("\r\n");

        //redis无值返回"$-1"
        if ("$-1".equals(values[0])) {
            return null;
        }
        return values[1];

    }

    public void set(String key, String value) throws IOException {

        if (key == null || value == null) {
            return;
        }

        //封装数据
        StringBuilder data = new StringBuilder();
        //命令参数个数
        data.append("*3").append("\r\n");
        data.append("$3").append("\r\n");
        data.append("SET").append("\r\n");
        //key 字节长度
        data.append("$").append(key.getBytes().length).append("\r\n");
        data.append(key).append("\r\n");
        //value字节长度
        data.append("$").append(value.getBytes().length).append("\r\n");
        data.append(value).append("\r\n");

        System.out.println(data);
        //socket传递数据
        outputStream.write(data.toString().getBytes());

        //读取返回信息
        byte[] response = new byte[10];
        inputStream.read(response);
    }

    public static void main(String[] args) throws IOException {
        RedisClient redisClient = new RedisClient("127.0.0.1", 6379);

        redisClient.set("hello", "redis-client");

        System.out.println(String.format("get data from redis:%s", redisClient.get("hello")));
    }
}

可以看到,这个简单的客户端可以正常的工作:

原文地址:https://www.cnblogs.com/wkzhao/p/10285442.html

时间: 2024-10-10 04:13:33

实现一个简单的redis-client的相关文章

Go语言之从0到1实现一个简单的Redis连接池

Go语言之从0到1实现一个简单的Redis连接池 前言 最近学习了一些Go语言开发相关内容,但是苦于手头没有可以练手的项目,学的时候理解不清楚,学过容易忘. 结合之前组内分享时学到的Redis相关知识,以及Redis Protocol文档,就想着自己造个轮子练练手. 这次我把目标放在了Redis client implemented with Go,使用原生Go语言和TCP实现一个简单的Redis连接池和协议解析,以此来让自己入门Go语言,并加深理解和记忆.(这样做直接导致的后果是,最近写JS时

[原]一个简单的TCP Client所涉及到的头文件

今天在Linux环境下写了一个最简单的TCP Client程序,没想到Linux环境下的头文件竟然这么分散,让我这样的菜鸟很是郁闷啊.编译成功的代码如下: #include <iostream> #include <string.h> #include <sys/socket.h> // Not need! #include <netinet/in.h> // struct sockadd_in, htons() #include <arpa/inet

演示一个简单的Redis队列

0.Windows Service版下载 https://github.com/rgl/redis/downloads 1.新建一个Console项目 打开Nuget控制台,执行以下命令 Install-Package ServiceStack.Common -Version 3.9.71 Install-Package ServiceStack.Redis -Version 3.9.71 2.在Main中输入测试数据 using (var redis = new RedisClient(cac

一个简单的redis调用类

能只能判断函数的调用规则,容错规则, 例如set函数 set($key, $value, $time = false) 根据time的真假来判断是否使用set,或者是setex函数 get函数 get($key, $json_decode = true) 根据json_decode来判断是否返回字符串或者是数组,默认返回数组 同时定义一个 private $tags = array( 'set'=>'set', 'setx'=>'set', ) 类内部使用魔术方法__call($name,$a

简单的HBase Client端实现

前言 newbie刚接触HBase,遇到几个初学者常见的关于HBase问题,这里就问题就不多做介绍,主要还是编码优化问题,下面专门介绍以下几点,希望对于初学者有所帮助. Tips RowKey的设计 HBase的无论什么操作都是对rowkey进行扫描操作的,rowkey的排序是按照字典序来排的. IO考虑 为读优化 设计行健时,尽量把行健按照序号紧挨一起,减少扫描. 为写优化 主要是考虑所有的rowkey不要写到同一个region上,这样会导致其他机器很空闲,只有这个region的吞吐量就是你应

用redis做一个简单的秒杀

下面是一个简单的下单操作 <?php include "MMysql.class.php"; $configArr=[ 'host'=>, 'port'=>, 'user'=>, 'passwd'=>, 'dbname'=>, ]; $db = new MMysql($configArr); $sql="select * from sdb_b2c_products where product_id='38'"; $product=

一个简单的监控redis性能的python脚本

一个简单的监控redis性能的python脚本 上一篇已经讲了如何监控memcached了,现在也顺带讲如何监控redis. 首先介绍下监控redis那些信息: Redis ping:检验ping Redis alive:查看检查端口是否alive Redis connections:查看连接数 Redis blockedClients:正在等待阻塞客户端数量 Redis connectionsUsage:redis的连接使用率 Redis memoryUsage:redis内存使用量 Redi

Windows下简单安装Redis

Windows下简单安装Redis 最新下载地址:https://raw.github.com/mythz/redis-windows/master/downloads/redis64-latest.zip 2. 解压到本地任一目录 (例如 D:/Redis) 3. 命令行进入解压目录,启动(Redis Server): redis-server.exe redis.windows.conf 4. 重新启动一个命令行窗口,启动(Redis client): redis-cli.exe 5. 测试

【轮子狂魔】手把手教你自造Redis Client

为什么做Redis Client? Redis Client顾名思义,redis的客户端,主要是封装了一些对于Redis的操作. 而目前用的比较广泛的 ServiceStack.Redis 不学好,居然开始收费了. 作为轮子狂魔,是可忍孰不可忍啊.于是我决定自己造轮子了. Redis通信协议 先给个Redis官方的通信协议地址:http://redisdoc.com/topic/protocol.html 关键是我截图的部分,我们可以得到以下几个信息: 1.tcp协议 2.默认端口6379 3.

更高效地提高redis client多线程操作的并发吞吐设计

Redis是一个非常高效的基于内存的NOSQL数据库,它提供非常高效的数据读写效能.在实际应用中往往是带宽和CLIENT库读写损耗过高导致无法更好地发挥出Redis更出色的能力.下面结合一些redis本身的特性和一些client操作上的改变来提高整个redis操作的交通. 上图是反映平常操作redis的情况,每个线程都独立的发起相应连接对redis的网络读写.虽然我们可以通过批操作的方式来把当前多个操作合并成一个,但这种方式只能针对当单线程,而多线程相互合并则设计上很少关注.从redis的协议来