手写JAVA代码实现与redis传输数据

腾讯四大方向面经汇总:前端、Java、C++、Go全解析 技术面试的底层逻辑,往往藏在各语言、框架的表象之下。无论是浏览器渲染机制、JVM内存模型、C++的RAII与移动语义,还是Go的GMP并发调度,大厂面试官真正考察的都是候选人“理解原理并落地决策”的能力。并发编程、性能优化、容器与数据结构这些高频考点,在不同技术栈中呈现出共通的考察维度——从基础八股到项目深挖,从手写代码到方案选型,每轮面试都在验证你能否在复杂工程中做出正确取舍。本文基于真实面试经历,完整复盘腾讯前端、Java、C++、Go四个方向的核心题目、追问链与答题思路,并横向对比各方向考察重点,提炼 阅读详情

一、需求背景

1.背景介绍

上一章**Redis简介、使用**中,讲述了redis服务端的Windows版本安装,以及Java客户端Jedis的使用。
引入Redis提供的客户端依赖就可实现和Redis服务端实现数据传输

2.需求简介

在不引入依赖的情况下,自己通过Java代码实现和Redis服务端实现数据传输

二、需求分析

1.需求拆解

想和Redis服务端进行数据传输
a.首先需要连接服务器(传输层)
b.传输的数据以字节、接口协议的方式进行,那么就需要将用户输入的数据转化为需要的数据格式(数据处理层)
c.为了方便使用者完成以上动作,提供相应的实现方法(操作层)

2.难点解析

a.获取传输给服务器的数据格式

传输的数据以字节、接口协议的方式进行。那么是以何种方式进行呢?
我们可以利用Java创建一个伪服务器,然后通过Jedis提供的set方法向伪服务器放数据

public static void main(String[] args) throws IOException {
		//创建本机端口6379的服务器
        ServerSocket serverSocket = new ServerSocket(6379);
        Socket socket = serverSocket.accept();
        //获取写进服务器的数据
        InputStream inputStream = socket.getInputStream();
        byte b[] = new byte[1024];
        inputStream.read(b);
        System.out.println(new String(b));
    }

启动上面的方法,开启伪服务器

import redis.clients.jedis.Jedis;

public class App {
    public static void main(String[] args) {
    	//向本机建立的伪服务器放入数据
        Jedis jedis = new Jedis("localhost",6379);
        jedis.set("foo", "bar");
        String value = jedis.get("foo");
        System.out.println("取得值为:"+value);
    }
}

执行上面的客户端方法,发送数据。查看伪服务器端控制台,结果如下:
在这里插入图片描述

由此看出,set(“foo”, “bar”)实际上传给服务端的数据如上样式。

b.解析数据协议

协议规则可查看Redis官网https://redis.io/topics/protocol
在这里插入图片描述
上面示例中传给服务器的第一行为:*3(根据官网描述,*在第一个字节则表示数组,*3表示数组个数为3。[$3,SET]、[$3,foo]、[$3,bar])
第二行:$3( $在第一个字节则表示字符,$3则表示有三个字节:S E T )
第三行:SET(就是执行set操作)
后面依次类推
而每一行在什么时候结尾(结尾标记)。由上面截图中最后一句英文可以看出"\r\n"代表一行结束。

三、搭建框架

1.流程图解

在这里插入图片描述

2.逻辑梳理

流程图如上所示:
1.用户创建操作层中Jedis对象,通过构造方法将IP、端口传入
2.Jedis的有参构造方法中创建传输层的Connection对象,将IP、端口数值放入connection对象中
3.用户调用操作层的Jedis类提供的set、get方法进行操作
4.操作层的Jedis类提供的set、get方法调用传输层中的sendCommand方法,方法中先调用Connection类中提供的connect方法,进行连接redis服务器
5.sendCommand方法再调用数据处理层类Protocol中sendCommand方法,处理数据
6.将处理好的数据,传输给redis

四、代码实现

/**
 * 提供操作方法
 */
public class Jedis {
    private Connection connection;

    public Jedis(String ip, int port) {
        connection = new Connection(ip, port);
    }

    public String set(final String key,final String value){
        connection.sendCommand(Protocol.Command.SET,key.getBytes(),value.getBytes());
        return "";
    }
    public String get(final String key){
        return connection.sendCommand(Protocol.Command.GET,key.getBytes()).getReply();
    }
}
/**
 * 协议
 */
public class Protocol {

    private static final String X = "*";
    private static final String D = "$";
    private static final String K = "\r\n";
    /**
     * 组装发送信息
     * @param command
     * @param outputStream
     * @param b
     */
    public static  void sendCommand(Protocol.Command command,OutputStream outputStream,byte[] ...b){
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(X).append(b.length+1).append(K);//*3
        stringBuffer.append(D).append(command.name().length()).append(K);//$3
        stringBuffer.append(command).append(K);
        for(byte []bytes:b){
            stringBuffer.append(D).append(bytes.length).append(K);
            stringBuffer.append(new String(bytes)).append(K);
        }
        try {
            System.out.println(stringBuffer.toString());
            outputStream.write(stringBuffer.toString().getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static enum Command{
        SET,GET
    }
}
public class Connection {
    private Socket socket;
    private String ip;
    private int port;
    private OutputStream outputStream;
    private InputStream inputStream;

    public Connection(String ip, int port) {
        this.ip = ip;
        this.port = port;
    }
    public String getReply(){
        byte b[] = new byte[1024];
        try {
            socket.getInputStream().read(b);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new String(b);
    }

    public Connection sendCommand(Protocol.Command command,byte[] ...b){
        //连接
        connect();
        //发送
        Protocol.sendCommand(command,outputStream,b);
        return this;
    }

    private void connect() {
        try {
            socket = new Socket(ip, port);
            outputStream = socket.getOutputStream();
            inputStream = socket.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
一名工作五年的Java程序员横扫BAT面试经历!值得借鉴! 整个春招持续了4个月,对自己意志也是一个很大的挑战。我也有幸能与那么多优秀的人一起并肩作战,让我坚持到最后一刻,感谢有你们。 这个春招也遇到了很多奇怪的公司,比如说美团不知为何不给内推,CVTE笔试刷掉有实习经历的,吉比特挂得莫名其妙,网易玄学招人,京东20分钟面试,华为聊天招人 面试详细过程 阿里巴巴 一面(36分钟)芝麻信用 hashmap和hashtable区别 为什么产生死锁 jvm类... 阅读详情

相关推荐

Java实现Redis数据导入导出完整解决方案

Redis的高性能源于其五种核心数据结构:String、Hash、List、Set 和 Sorted Set。String适用于键值存储,支持操作,常用于缓存文本或序列化对象;Hash通过实现字段级更新,适合存储对象属性;List以支持先进先出队列;Set利用保证元素唯一性,便于集合运算;Sorted Set通过分数排序,如实现排行榜功能。在Java中,Jedis客户端通过等方法直接映射Redis命令,开发者需理解各结构的语义差异及返回类型(如List为,Set为。

weixin_35414484的博客 783

Canal MySQL日志同步Redis (JAVA代码实现)-----下

在上一个博客安装成功了(Canal确认启动成功),然后接下来进行代码实现了。 https://blog.youkuaiyun.com/d875708765/article/details/106430762 同步需要一直运行着,所以这个创建一个普通的Maven工程,然后打成jar包放到服务器进行运行(最好现在本地测试了没有问题在放上去) 以下是依赖 <dependencies> <!--阿里巴巴canal--> <dependency>

它叫当当的博客 641

redis视频分块上传

将一个视频分块加一个视频元数据上传到服务端,进行redis断点续传

将文件存放到redis

import java.io.*; 原创@北京我辉哥 public class File2Redis { /* * 文件转数组 * */ public byte[] toByteArray(String path) throws IOException { if (path == null)

rpcyaoqisan的博客 1万+

spring-boot加redis的秒传与分片上传demo(85668064)

项目搭建IDE为STS,spring boot + redis 实现功能,前后端代码实现细节。导入即可启动,运行时浏览器打开localhost:9090/index.html测试页面。 PS:重要!开发环境注意设置好存储路径,该路径在测试环境下会清空文件夹。 注意修改配置文件中redis地址

Error: dependent ‘..\..\..\..\Qt\5.15.2\msvc2019\include\QtWidgets\QMainWindow‘ does not exist.

核心问题:修改 Build 目录为源码子目录后,MSVC 编译报错,本质是变量设置异常,导致 qmake 生成多余回溯路径;临时解决:在 .pro 文件添加;最优解决:将上述配置写入 Qt 的 msvc 对应 qmake.conf 全局文件,一劳永逸;禁止 qmake 计算路径时向上回溯,避免生成异常路径。

mumufan05的专栏 878

java redis 推送_java实现Redis消息发布和订阅

我再次觉得在简单消息应用的场景使用redis实在很方便,不仅可以使用smove或RPOPLPUSH等命令实现消息不丢失(ack模式),也可以直接使用pop和push来消费和发布消息,更可以使用PUBLISH/SUBSCRIBE发布订阅的模式。1.Redis发布订阅架构Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者,订阅者和Channel。发布者和订阅...

weixin_30191947的博客 2375

MATLAB Appdesigner开发独立桌面App全流程(一):以打开串口功能为例介绍Appdesigner的基本使用

本文详细介绍了Appdesigner的基本使用,以串口功能为例介绍按钮回调函数的实现以及控件之间通信的问题

Zhuwany的博客 3万+

java文件实现文件的上传和下载

一、 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传; 支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传。刷新页面后继续传输。关闭浏览器后保留进度信息。 支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端文件夹层级结构与本地相同。 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验; 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构。 支持断点续传,关闭浏览器或刷新浏

yjjatqihc的博客 607

南京银行信息技术岗提前批笔试与面试

1、笔试 笔试大致可以分为三部分:性格测试、行测题目、专业知识 性格测试 性格测试一般会有较多的体量,可能一共大概有一百多道接近两百道的样子,这个是不限时的。 前面有100道是这样的题目,就是有四个选项都是各种形容词,然后分别选出最符合自己的与最不符合自己的选项。这种题你就顺着自己的潜意识填就行了,但是前后要一致,我怀疑他出这么多题,可能就是考一考你记不记得前面填了啥。比如你做到第90题的时候,可能会出现和前面第2题类似的四个形容词,更有甚者就是一模一样的,你要对自己之前选的什么有个比较清楚的记忆。

qq_40971025的博客 6921

Linux-RGMII PHY 88E1512 驱动调试记录

1. 简介 1)开发板平台:创龙 AM5728 (tl5728-easy-evm) 2)PHY芯片:Marvell 88E1512 88E1512和88E1510都是一个系列的phy,采用marvell的通用phy驱动,驱动源码路径如下:drivers/net/phy/marvell.c 2. 应用场景 1)系统框图 AM5728连接两个PHY,PHY0的工作模式是 RGMII to Copper (RGMII到电口),PHY1的工作模式是 RGMII to SGMII。 两个PHY与处理器的连接方式都是

weixin_40407893的博客 2万+

手写Redis客户端-实现自己的Jedis

手写Redis客户端-实现自己的Jedis 上一篇,我们详细研究了Redis底层使用的协议——RESP(REdis Serialization Protocol),这篇我们在基于理解了RESP原理的基础上,手写一个Redis客户端,实现一个自己的Jedis(mini版)。 还没了解Redis底层RESP协议 的同学,可以先移步Redis底层协议RESP详解,对RESP做一个大致的了解。 Redis...

ljheee的博客 1098

领域驱动设计整理——实体和值对象设计

实体引言在领域驱动设计里,实体的设计可以说是通用语言的核心,也是最开始在模型划分中需要考虑的。怎么样设计实体和怎么样划分限界上下文同样重要。实体的概念就是要保证通用语言的完整性。领域驱动让设计实体的关注点从数据的属性和表的关联转化到了富有行为的领域概念上。 实体是具有可变性的,这是一个和值对象比较明显的区分,也即实体是可以持续得变化,持续得修改,并且具有唯一的标识。在设计实体的时候需要跳出CRUD的

马猴烧酒└(┐卍^o^)卍ドゥルルル~楪詩月「YUZURIHA SHIZUKI」 2万+

手写Redis客户端

一、前言 要想手写Redis客户端,必须先了解清楚Redis的通信协议是什么。我的理解就是客户端与服务端按照双方约定的规则来进行的编码方式,客户端将要发送的命令进行编码,然后服务端收到后,使用同样的协议进行解码,服务端处理完成后,再次编码返回给客户端,客户端解码拿到返回结果,这样就完成了一次通信。博主这里为了方便小伙伴们理解,画了一张客户端与服务端通信的结构图,如下: 理解了这个通信结构图,我们...

riemann_的博客 967

YOLOv改进 | YOLOv11添加WTConv小波卷积,能够更有效地捕捉局部和全局特征

在计算机视觉目标检测领域,YOLO(You Only Look Once)系列算法凭借“单阶段检测”的高效性(一次前向传播同时完成目标定位与分类),已成为工业界与学术界的主流选择。从YOLOv1到YOLOv11,算法持续迭代优化,在速度与精度之间寻求平衡,广泛应用于自动驾驶、智能安防、工业质检等场景。为解决上述问题,本文提出一种基于,将输入特征图分解为不同频率的子带(低频全局信息与高频局部细节),并分别通过卷积操作提取局部与全局特征,最后融合多尺度特征,从而更有效地捕捉目标的局部细节与全局结构。

走向CTO的路上... 1248

SPICE框架:自博弈提升大语言模型推理能力

自博弈训练是提升大语言模型推理能力的前沿技术,其核心思想是通过模型自我对话实现持续迭代优化。SPICE框架创新性地采用文档驱动的自博弈机制,结合思维链提示和迭代式上下文扩展,显著提升模型在数学证明、逻辑推理等复杂任务中的表现。该技术在代码生成、金融分析等工程场景中展现出23%-41%的性能提升,其关键技术包括多样性控制、质量过滤和记忆管理。随着与RLAIF等强化学习方法的结合,这种训练范式正在推动大模型向更接近人类思维方式的推理能力进化。

weixin_28686771的博客 402

redis 客户端_手写Redis客户端-实现自己的Jedis

手写Redis客户端-实现自己的Jedis上一篇,我们详细研究了Redis底层使用的协议——RESP(REdis Serialization Protocol),这篇我们在基于理解了RESP原理的基础上,手写一个Redis客户端,实现一个自己的Jedis(mini版)。还没了解Redis底层RESP协议 的同学,可以先移步Redis底层协议RESP详解,对RESP做一个大致的了解。Redis分为服...

weixin_39629947的博客 99

USB2.0协议解读

就写到这吧,其他协议层等属于软件需要了解的东西了。简单看了下,本文总结的有点乱,有两个原因吧,其一是理解的不够透彻,无法用简单明了的语言总结;其二是感觉这个协议文档章节划分的也不是很好,有点大杂烩。

qflook的博客 3673

java技术分享干货,java面试手写代码题目

俗话说“生于忧患,死于安乐”,其实大部分中年危机,就是在安乐中产生的。有的人或许会反驳,“照你这么说,我还必须奋斗了,不奋斗就要死,难道选择安逸的生活就不对吗?我就没有选择自己生活方式的权利吗?说这句话的人其实有一些误解,误解就在于,安逸的生活并不等于不需要奋斗,这要看你的家底。某聪如果说要选择安逸的生活,他可以很安逸,因为他有了安逸的资本,而大部分的你,并没有这个资本,你如果过早的选择了安逸的生活,那么结局往往会很悲惨,而你能做的,最多也就是让你的后代有选择安逸的资本。

m0_60635176的博客 949

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Redis简介、使用

一、简介 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 Redis支持数据的备份,即master-slave模式的数据备份。 二、使用 1.Redis a.准备工作 我们都知道Re

study_study_know的博客 180

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java秋招面试八股文通关指南:JVM到Redis核心考点全拆解

技术面试是检验开发者知识体系与工程能力的重要关口,尤其在秋招场景下,扎实的基础知识往往决定了候选人能否在激烈竞争中突围。面试官通过追问JVM内存模型、并发机制、Spring原理等核心问题,考察候选人对底层实现的理解深度;而常用的排序算法如冒泡排序、快速排序的编写能力,则直观反映基础编码功底。针对实际开发中常见的java: outofmemoryerror: insufficient memory问题,更需要从内存区域划分与垃圾回收机制入手系统掌握。本文从构建知识地图、高频考点拆解、结构化表达三个维度,系统梳

weixin_30367873的博客 304

android开发转到java后端开发

从Android转Java后端,你最大的优势就是不用从头学习Java语言本身。你需要做的是将知识体系从“客户端”向“服务端”延伸。这是一个挑战,但也是一个让你技术视野和职业路径变得更宽广的绝佳机会。

qq_28977215的博客 216

2026年Java面试高频题汇总:核心原理与实战解析

Java技术栈覆盖范围广,从基础语法到分布式架构,面试考察的不仅是记忆,更是对原理的深度理解。以HashMap为例,掌握底层数据结构与扩容机制,才能真正应对高并发下的性能场景;而JVM内存模型与垃圾回收机制,则决定了线上系统调优的方向。Spring Boot自动配置、MySQL索引优化,同样是工程实践中的高频考点。围绕2026年常见核心考点,梳理集合框架、并发编程、微服务、消息队列等关键知识,结合原理分析与实战案例,帮助开发者建立系统化的Java知识体系,从容应对招聘季的层层追问与场景深挖。

weixin_33994429的博客 269

十位互联网一线高工手写Java高级知识,原理+实战讲解

一面(个人感觉回答得还不错) 1. 自我介绍 2. 说项目,项目问的非常深(本人提到之前做过的一篇关于FULL GC的问题定位和优化的项目以及一个多并发的项目) 2.1 对于自己产于过项目的系统定位是否清楚? 2.2 对于系统的各个模块是否清楚? 2.3 每个接口的tps? 2.4 对于上下游系统的依赖? 2.5 对于使用到的中间件、框架是否清楚? 3. 你觉得你做的项目中最有亮点的事情? 4. memcache redis同类中间的差异、优缺点?使用注意点有哪些? memcache可以存储的

m0_57700605的博客 127

互联网大厂Java面试现场:严肃面试官与搞笑谢飞机的三轮对决

本文以一个互联网大厂Java求职面试现场为背景,讲述了严肃的面试官与搞笑的水货程序员谢飞机之间的三轮技术问答。面试官涵盖了Java核心知识、JUC、JVM、多线程、线程池、数据结构、Spring生态、分布式、中间件等方面,谢飞机在简单问题上答得不错,获得肯定;在复杂问题上回答含糊,引发趣味对话。文章末尾附带详尽的技术点解析,方便初学者学习。

2301_79516133的博客 439

Java即时聊天系统实战:基于Netty的网络编程与源码解析

网络编程是Java开发者的核心技能之一,而即时聊天系统则是综合检验这一能力的经典项目。要构建一个高并发、高可用的IM系统,必须深入理解TCP长连接、粘包拆包、心跳机制等基础概念,并借助Netty的Reactor线程模型实现高效通信。Netty作为业界主流的网络通信框架,不仅降低了NIO的开发复杂度,还提供了完善的编解码、连接管理和空闲检测能力,成为企业级IM、RPC等系统的技术基石。在工程实践中,将Java、Netty与MySQL、Redis结合,可完成从用户鉴权、会话管理到消息持久化的完整闭环。无论是课程

weixin_33146151的博客 295
上一篇: Redis简介、使用
下一篇: Linux之CentOS 7镜像安装教程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值