广告
返回顶部
首页 > 资讯 > 精选 >Java中Socket如何实现Redis客户端
  • 851
分享到

Java中Socket如何实现Redis客户端

2023-06-15 05:06:24 851人浏览 安东尼
摘要

小编给大家分享一下Java中Socket如何实现Redis客户端,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Redis是最常见的缓存服务中间件,在java开发中,一般使用 jedis 来实现。Redis的命令协议:$参数

小编给大家分享一下Java中Socket如何实现Redis客户端,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

Redis是最常见的缓存服务中间件,在java开发中,一般使用 jedis 来实现。

Redis的命令协议:

$参数数量n

$参数1的值的字节数组长度

$参数1的值的字符串表示

$参数2的值的字节数组长度

$参数2的值的字符串表示

...

$参数n的值的字节数组长度

$参数n的值的字符串表示

Redis的返回协议:

状态回复(status reply)的第一个字节是 "+",单行字符串;
2、错误回复(error reply)的第一个字节是 "-";
3、整数回复(integer reply)的第一个字节是 ":";
4、批量回复(bulk reply)的第一个字节是 "$";
5、多条批量回复(multi bulk reply)的第一个字节是 "*";
6、所有的命令都是以 \r\n 结尾。

Java代码说明

针对上述规则,我们用两个类来实现:

SimpleRedisClient类,主要用于发送请求,并读取响应结果(字符串);

整体比较简单,稍微复杂点的地方就是读取流数据,遇到两种情况就该结束循环,一是返回长度为-1,二是返回字符串以 \r\n 结尾。

如果处理不当,可能会导致 read 阻塞,Socket卡住。

SimpleRedisData类,用于解析响应结果,把redis统一协议的字符串,解析为具体的对象。

这部分代码完全是按照协议规则来实现的,通过一个游标 pos 来向前移动,在移动过程中识别不同格式的数据。

最复杂的是 list 类型的数据,以 * 开头,后面跟着一个整数,表示列表中所有元素的数量,然后就是每一个列表元素的值,循环解析即可。

package demo;import java.io.Closeable;import java.io.IOException;import java.net.Socket;import java.util.List;public class SimpleRedisClient implements Closeable {    private String host;    private int port;    private String auth;    private Socket socket = null;    public SimpleRedisClient(String host, int port, String auth) {        this.host = host;        this.port = port;        this.auth = auth;        try {            socket = new Socket(this.host, this.port);            socket.setSoTimeout(8 * 1000);//8秒        } catch (Exception ex) {            socket = null;            ex.printStackTrace();        }    }    public boolean connect() throws IOException {        if (socket == null || auth == null || auth.length() <= 0) {            return false;        }        String response = execute("AUTH", auth);        if (response == null || response.length() <= 0) {            return false;        }        String res = new SimpleRedisData(response).getString();        return "OK".compareTo(res) == 0;    }    @Override    public void close()  {        try {            if (socket != null) {                socket.shutdownOutput();                socket.close();            }            //System.out.println("closed");        } catch (Exception ex) {            ex.printStackTrace();        }    }    public String getString(String key) {        if (socket == null || key == null || key.isEmpty()) {            return null;        }        try {            String response = execute("GET", key);            return new SimpleRedisData(response).getString();        } catch (Exception ex) {            ex.printStackTrace();            return null;        }    }    public String setString(String key, String value) {        if (socket == null || key == null || key.isEmpty()) {            return null;        }        try {            String response = execute("SET", key, value);            return new SimpleRedisData(response).getString();        } catch (Exception ex) {            ex.printStackTrace();            return null;        }    }    public String deleteKey(String key) throws IOException {        if (socket == null || key == null || key.isEmpty()) {            return null;        }        String response = execute("DEL", key);        return new SimpleRedisData(response).getString();    }    public List<String> geTKEys(String pattern) throws IOException {        if (socket == null || pattern == null || pattern.isEmpty()) {            return null;        }        String response = execute("KEYS", pattern);        return new SimpleRedisData(response).getStringList();    }    public String execute(String... args) throws IOException {        if (socket == null || args == null || args.length <= 0) {            return null;        }        //System.out.println(StringUtil.join(args, " "));        StringBuilder request = new StringBuilder();        request.append("*" + args.length).append("\r\n");//参数的数量        for (int i = 0; i < args.length; i++) {            request.append("$" + args[i].getBytes("utf8").length).append("\r\n");//参数的长度            request.append(args[i]).append("\r\n");//参数的内容        }        socket.getOutputStream().write(request.toString().getBytes());        socket.getOutputStream().flush();        StringBuilder reply = new StringBuilder();        int bufSize = 1024;        while (true) {            byte[] buf = new byte[bufSize];            int len = socket.getInputStream().read(buf);            if (len < 0) {                break;            }            String str = new String(buf, 0, len);            reply.append(str);            if (str.endsWith("\r\n")) {                break;            }        }        String response = reply.toString();        //System.out.println("response: " + response);        return response;    }}
package demo;import java.util.ArrayList;import java.util.List;public class SimpleRedisData {    public SimpleRedisData(String rawData) {        this.rawData = rawData;        //System.out.println(rawData);    }    private int pos;    private String rawData;    public String getString() {        if (rawData == null || rawData.length() <= 0) {            return null;        }        int i = rawData.indexOf("\r\n", pos);        if (i <= 0) {            return null;        }        char c = rawData.charAt(pos);        if (c == '+') {            int from = pos + 1;            int to = i;            String v = rawData.substring(from, to);            pos = to + 2;            return v;        } else if (c == '-') {            int from = pos + 1;            int to = i;            String v = rawData.substring(from, to);            pos = to + 2;            return v;        } else if (c == ':') {            int from = pos + 1;            int to = i;            String v = rawData.substring(from, to);            pos = to + 2;            return v;        } else if (c == '$') {            int from = pos + 1;            int to = i;            int bulkSize = Integer.parseInt(rawData.substring(from, to));            pos = to + 2;            from = pos;            to = pos + bulkSize;            try {                //$符号后面的数值是指内容的字节长度,而不是字符数量,所以要转换为二进制字节数组,再取指定长度的数据                byte[] buf = rawData.substring(from).getBytes("utf-8");                String v = new String(buf, 0, bulkSize);                pos = to + 2;                return v;            } catch (Exception ex) {                ex.printStackTrace();                return null;            }        } else {            return null;        }    }    public List<String> getStringList() {        if (rawData == null || rawData.length() <= 0) {            return null;        }        int i = rawData.indexOf("\r\n", pos);        if (i <= 0) {            return null;        }        char c = rawData.charAt(pos);        if (c == '*') {            List<String> values = new ArrayList<>();            int from = pos + 1;            int to = i;            int multSize = Integer.parseInt(rawData.substring(from, to));            pos = to + 2;            for (int index = 0; index < multSize; index++) {                values.add(getString());            }            return values;        } else {            return null;        }    }}
package demo;import org.junit.jupiter.api.Test;import java.util.List;public class RedisTest {    @Test    public void test() {        SimpleRedisClient client = null;        try {            client = new SimpleRedisClient("127.0.0.1", 6379, "123456");            System.out.println("connected: " + client.connect());            List<String> keyList = client.getKeys("api_*");            for (int i = 0; i < keyList.size(); i++) {                System.out.println((i + 1) + "\t" + keyList.get(i));            }           System.out.println("keys: " + keyList != null ? keyList.size() : "null");           System.out.println(client.getString("api_getCustomerName"));        } catch (Exception ex) {            ex.printStackTrace();        } finally {            if (client != null) {                client.close();            }        }    }}

优点:

不依赖任何第三方组件,可以顺利编译通过;

代码极其简单。

不足之处:

未考虑并发访问;

未提供更多的数据类型,以及读写方法,大家可以在此基础上包装一下。

看完了这篇文章,相信你对“Java中Socket如何实现Redis客户端”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: Java中Socket如何实现Redis客户端

本文链接: https://www.lsjlt.com/news/278191.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中Socket如何实现Redis客户端
    小编给大家分享一下Java中Socket如何实现Redis客户端,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Redis是最常见的缓存服务中间件,在java开发中,一般使用 jedis 来实现。Redis的命令协议:$参数...
    99+
    2023-06-15
  • Java Socket实现Redis客户端的详细说明
    Redis是最常见的缓存服务中间件,在java开发中,一般使用 jedis 来实现。 如果不想依赖第三方组件,自己实现一个简单的redis客户端工具,该如何实现呢?本文就是介绍这样一...
    99+
    2022-11-12
  • Java中怎么实现一个Socket通讯客户端
    Java中怎么实现一个Socket通讯客户端,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java Socket通讯代码 <xml version="...
    99+
    2023-06-17
  • Java中怎么利用Socket实现一个通讯客户端
    本篇文章给大家分享的是有关Java中怎么利用Socket实现一个通讯客户端,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体客户端代码如下:import java.n...
    99+
    2023-06-17
  • Java编程Socket如何实现多个客户端连接同一个服务端
    这篇文章主要介绍Java编程Socket如何实现多个客户端连接同一个服务端,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java Socket(套接字)通常也称作"套接字",用于描述IP地址和端口...
    99+
    2023-05-30
    java socket
  • PHP+Socket如何实现客户端与服务端数据传输
    这篇文章主要介绍“PHP+Socket如何实现客户端与服务端数据传输”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP+Socket如何实现客户端与服务端数据传输”文章能帮助大家解决问题。sock...
    99+
    2023-07-05
  • Python基于socket实现TCP客户端和服务端
    目录一、基于socket实现的TCP客户端二、基于socket实现的TCP服务端三、socket实现的多任务版TCP服务端1、面向对象版本一、基于socket实现的TCP客户端 im...
    99+
    2022-11-10
  • nodejs中socket怎么实现服务端和客户端功能
    小编给大家分享一下nodejs中socket怎么实现服务端和客户端功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体如下:使用node.js的net模块能很快的开发出基于TCP的服务端...
    99+
    2022-10-19
  • Java实现websocket客户端
    常规情况下,大多数时候Java后台作为websocket服务端,实现方式也比较简单,网上很多案例代码。但是很多时候项目中服务与服务之间也需要使用websocket通信,此时项目就需要实现客户端功能。 步骤一:导入依赖: org.jav...
    99+
    2023-10-23
    java websocket 开发语言
  • java 中怎么配置Socket多线程客户端
    java 中怎么配置Socket多线程客户端,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。static class Sender ...
    99+
    2023-06-17
  • Golang如何实现 pipeline 模式的 redis 客户端
    这篇文章主要介绍“Golang如何实现 pipeline 模式的 redis 客户端”,在日常操作中,相信很多人在Golang如何实现 pipeline 模式的 redis 客户端问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-06-20
  • nodejs中如何实现socket服务端和客户端简单通信功能
    小编给大家分享一下nodejs中如何实现socket服务端和客户端简单通信功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!本文实例讲述了通过node.js的net模块实现nodejs s...
    99+
    2022-10-19
  • java客户端中如何使用Jedis实现操作Redis Sentinel 连接池
    这篇文章给大家介绍java客户端中如何使用Jedis实现操作Redis Sentinel 连接池,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。pom.xml配置<dependency> <grou...
    99+
    2023-05-31
    jedis sentinel java
  • Golang 实现 Redis系列(六)如何实现 pipeline 模式的 redis 客户端
    本文的完整代码在github.com/hdt3213/godis/redis/client 通常 TCP 客户端的通信模式都是阻塞式的: 客户端发送请求 -> 等待服务端响应 ...
    99+
    2022-11-12
  • Android socket实现原理详解 服务端和客户端如何搭建
    本文实例为大家分享了Android socket的实现原理,供大家参考,具体内容如下Socket套接字 是网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。socket实现的原理机制:通信的两端都有Socket...
    99+
    2023-05-30
    android socket roi
  • redis集群客户端java实现的方法是什么
    在Java中实现Redis集群客户端,可以使用Jedis Cluster库。Jedis Cluster是Jedis库的扩展,专门用于...
    99+
    2023-09-16
    redis java
  • nodejs socket实现的服务端和客户端功能示例
    本文实例讲述了nodejs socket实现的服务端和客户端功能。分享给大家供大家参考,具体如下: 使用node.js的net模块能很快的开发出基于TCP的服务端和客户端。直接贴代码。 server.js ...
    99+
    2022-06-04
    示例 服务端 客户端
  • Python基于socket怎么实现TCP客户端和服务端
    这篇文章主要讲解了“Python基于socket怎么实现TCP客户端和服务端”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python基于socket怎么实现TCP客户端和服务端”吧!一、基...
    99+
    2023-06-30
  • Redis远程连接Redis客户端的实现步骤
    目录一 进入redis下的目录二 启动 redis服务三 连接客户端四 在windows本地中安装 redis可视化软件五 在linux关闭客户端六 设置防火墙规则:我的因为已经设置...
    99+
    2022-11-13
  • Java Socket通讯如何进行客户端的信息通信
    本篇文章为大家展示了Java Socket通讯如何进行客户端的信息通信,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java Socket通讯在实际的使用中有很多关键代码需要我们学习,那么首先我们就...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作