当前位置: 首页 > news >正文

Java-IDEA模拟一个Redis服务器,与Redis客户端进行一次简单的交互。默认端口号:6379

首先要了解Redis的交互协议。

摘抄:

  1. 简单字符串(Simple Strings): 以 “+” 开头,例如 “+OK\r\n” 表示一个成功的响应。
  2. 错误(Errors): 以 “-” 开头,例如 “-ERR unknown command\r\n” 表示一个错误响应。
  3. 整数(Integers): 以 “:” 开头,例如 “:1000\r\n” 表示整数1000。
  4. 批量字符串(Bulk Strings): 以 “$” 开头,例如 “$6\r\nfoobar\r\n” 表示一个长度为6的字符串 “foobar”。
  5. 数组(Arrays): 以 “*” 开头,例如 “*3\r\n:1\r\n:2\r\n:3\r\n” 表示包含3个整数的数组 [1, 2, 3]。

 最好设置Redis是无密码允许访问。

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;/*** @ Annotation:模拟Redis服务器 port=6379*/
public class RedisHost {/*** 1.客户端连接命令:COMMAND* 2.RedisHost response "OK"* 3.客户端发送命令* 4.RedisHost response "OK"(如果是"set"命令)* 5.客户端发送命令* 6.RedisHost response "value"(如果是"get")命令* @param args*/public static void main(String[] args) {try {byte[] bytes = new byte[1024];ServerSocket server = new ServerSocket();InetSocketAddress address = new InetSocketAddress("127.0.0.1", 6379);server.bind(address);Socket accept = server.accept();InputStream is = accept.getInputStream();//客户端带宽//客户端连接int clientCon = is.read(bytes);System.out.println("客户端连接:" + new String(bytes, 0, clientCon));OutputStream os = accept.getOutputStream();//Redis服务器带宽//Redis回应OKString hostRespCon = "+OK\r\n";os.write(hostRespCon.getBytes());os.flush();System.out.println("客户端与Redis服务器连接成功,Redis服务器响应了:" + hostRespCon);System.out.println("客户端可以继续输入内容");//等待客户端输入。。。。//读取客户端的第一次输入int clientSet = is.read(bytes);String clientStr = new String(bytes, 0, clientSet);System.out.println("客户端第一次输入了:" + clientStr);//Redis对客户端的输入响应+OKString hostRespSet = "+OK\r\n";os.write(hostRespSet.getBytes());os.flush();System.out.println("客户端输入成功,Redis服务器响应了:" + hostRespSet);//客户端再次输入System.out.println("客户端可以继续输入内容");int clientGet = is.read(bytes);String clientGetStr = new String(bytes, 0, clientGet);System.out.println("客户端又输入了:" + clientGetStr);//组装语句String substring = getLastStr(clientStr);//值//Redis响应if (clientGetStr.contains("get")) {if (getLastStr(clientGetStr).equals(getKey(clientStr))){os.write(substring.getBytes());System.out.println("服务器响应了:" + substring);}else {String notExist="*-1\r\n$3\r\nnull\r\n";os.write(notExist.getBytes());System.out.println("客户端输入的键:"+getLastStr(clientGetStr)+"不存在!");}}//释放资源os.flush();is.close();os.close();accept.close();server.close();} catch (IOException e) {e.printStackTrace();}}//从后面开始截取:从最后一个字符"input"开始,截到最后。public static String getLastStr(String input) {return input.substring(input.lastIndexOf("$"));}public static String getKey(String s){return s.substring(s.indexOf(s.substring(s.indexOf("$",6))),s.lastIndexOf("$"));}
}

 

 

相关文章:

Java-IDEA模拟一个Redis服务器,与Redis客户端进行一次简单的交互。默认端口号:6379

首先要了解Redis的交互协议。 摘抄: 简单字符串(Simple Strings): 以 “” 开头,例如 “OK\r\n” 表示一个成功的响应。错误(Errors): 以 “-” 开头,例如 “-ERR unknown command\r\n” 表示一…...

WEB服务与虚拟主机/IIS中间件部署

WWW(庞大的信息系统)是基于客户机/服务器⽅式的信息发现技术和超⽂本技术的综合。网页浏览器//网页服务器 WWW的构建基于三项核⼼技术: HTTP:超文本传输协议,⽤于在Web服务器和客户端之间传输数据。HTML:⽤…...

JAVA开源项目 图书个性化推荐系统 计算机毕业设计

本文项目编号 T 015 ,文末自助获取源码 \color{red}{T015,文末自助获取源码} T015,文末自助获取源码 目录 一、系统介绍1.1 业务分析1.2 用例设计1.3 时序设计 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究…...

Spring Boot 注解探秘:HTTP 请求的魅力之旅

在SpringBoot应用开发中,处理Http请求是一项基础且重要的任务。Spring Boot通过提供一系列丰富的注解极大地简化了这一过程,使得定义请求处理器和路由变得更加直观与便捷。这些注解不仅帮助开发者清晰地定义不同类型的HTTP请求如何被处理,同时…...

TYPE-C USB设计

目录 摘要 TYPE-C电路 握手过程 USB电路 摘要 TYPE-C,是USB的一种接口,USB的第一种接口为常见的USB接口,U盘即为这种接口;第二种接口的形状类似一个凸字,常应用在打印机中,第三种接口即为TYPE-C,支持正…...

Python炒股自动化,怎样理解股票交易性质

炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取…...

Vue2 day-02

目录 一. Vue脚手架(Vue CLI) 1.1 安装新版本的Vue脚手架vue/cli 1.2 用命令创建Vue项目 1.2.1 命令创建vue项目 1.2.2 默认创建 1.2.3 自定义创建 1.2.4 基于ui界面创建Vue项目 1.3 分析Vue脚手架生成的项目结构及代码执行 1.3.1 默认创建文件结构 1.3.2 分开放置文…...

什么?!新版 Node.js V22.5 自带 SQLite 模块啦

前言 2024年7月,Node.js V22.5.0 版本发布,自带了 SQLite 模块,意味着开发者可以直接在程序中使用 SQLite 数据库,而无需引入第三方库👍。 话不多说,感觉来体验一波✈。 安装/升级 我现在用的是21.4.0版…...

Maven持续集成(Continuous integration,简称CI)版本友好管理

从Maven 3.5.0-beta-1 版本开始可以在pom文件中使用 r e v i s i o n 、 {revision}、 revision、{sha1}、${changelist}做为版本的占位符。 一、单module简单使用${revision}的场景 <project><modelVersion>4.0.0</modelVersion><parent><groupId…...

EvoSuite使用总结

1.安装EvoSuite插件 以IDEA为例&#xff0c;在Plugins栏搜索EvoSuite后点击install&#xff0c;安装完成后重启IDEA 2.使用EvoSuite 选中文件右键选择Run EvoSuite 生成成功可以看到如下提示&#xff1a; 注意事项&#xff1a; 生成路径&#xff1a;src/test/java 使用juni…...

Cortex-A7:简单中断处理(不可嵌套中断)机制

0 参考资料 ARM Cortex-A(armV7)编程手册V4.0.pdf ARM体系结构与编程第2版1 前言 Cortex-M系列内核MCU中断硬件原生支持嵌套中断&#xff0c;开发者不需要为了实现嵌套中断而进行额外的工作。但在Cortex-A7中&#xff0c;硬件原生是不支持嵌套中断的&#xff0c;这从Cortex-A…...

k8s HPA

水平自动扩容和缩容HPA HPA全称Horizontal Pod Autoscaler&#xff0c;即pod水平自动伸缩。HPA可以基于CPU利用率对replication controller、deployment和replicaset中的pod数量进行自动扩缩容&#xff08;除了CPU利用率&#xff0c;也可以基于其他应用程序提供的度量指标cust…...

5G移动网络运维实验(训)室解决方案

随着第五代移动通信技术&#xff08;5G&#xff09;的快速普及和工业互联网的迅猛发展&#xff0c;全球制造业正面临着前所未有的深刻变革。5G技术凭借其超高的传输速率、极低的延迟以及大规模的连接能力&#xff0c;为工业自动化、智能制造等领域带来了革命性的技术支持。为了…...

单片机学习笔记

一、单片机帝国的诞生与发展 1.1 单片机的基本概念 单片机是一种集成电路芯片&#xff0c;采用超大规模的集成电路把具有数据处理功能的中央处理器存储器、输入输出端口、外围电路和相关外设集成在一块硅片上构成一个小而完整的微型计算机系统。 一般而言&#xff0c;单片机也…...

SpringBoot中@Value获取值和@ConfigurationProperties获取值用法及比较

SpringBoot中Value获取值和ConfigurationProperties获取值用法及比较 更新时间&#xff1a;2024年08月08日 09:41:48 作者&#xff1a;岳轩子 在Spring Boot中,Value注解是一个非常有用的特性,它允许我们将外部的配置注入到我们的Bean中,ConfigurationProperties用于将配置文件…...

执行任务赚积分

题目描述 现有N个任务需要处理&#xff0c;同一时间只能处理一个任务&#xff0c;处理每个任务所需要的时间固定为1。 每个任务都有最晚处理时间限制和积分值&#xff0c;在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。 可用于处理任务的时间有限&#xff0c;请问…...

使用TLS解决Docker API暴露2375端口的问题

问题起因 由于本人开发环境是在 Windows&#xff0c;开发完成后需要使用 Dockerfile 打包镜像&#xff0c;这个过程需要有一个 Docker 服务完成&#xff0c;Windows 安装 Docker 会影响到很多环境&#xff0c;我又不想本地开虚拟机使用 Docker&#xff0c;于是我就索性使用服务…...

Pyspark中catalog的作用与常用方法

文章目录 Pyspark catalog用法catalog 介绍cache 缓存表uncache 清除缓存表cleanCache 清理所有缓存表createExternalTable 创建外部表currentDatabase 返回当前默认库tableExists 检查数据表是否存在&#xff0c;包含临时视图databaseExists 检查数据库是否存在dropGlobalTemp…...

聚焦2024数博会|与天空卫士一起探索AI与数据安全的融合应用

中国国际大数据产业博览会&#xff08;简称数博会&#xff09;&#xff0c;是全球首个以大数据为主题的博览会&#xff0c;自2015年创办以来&#xff0c;经过多年的深厚沉淀&#xff0c;数博会已发展成为国际知名、引领前沿趋势的专业展示合作平台。 2024年8月28日至30日&#…...

实战docker第二天——cuda11.8,pytorch基础环境docker打包

在容器化环境中打包CUDA和PyTorch基础环境&#xff0c;可以将所有相关的软件依赖和配置封装在一个Docker镜像中。这种方法确保了在不同环境中运行应用程序时的一致性和可移植性&#xff1a; Docker&#xff1a;提供了容器化技术&#xff0c;通过将应用程序及其所有依赖打包在一…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

Visual Studio Code 扩展

Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后&#xff0c;命令 changeCase.commands 可预览转换效果 EmmyLua…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...