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

2024.1.9 基于 Jedis 通过 Java 客户端连接 Redis 服务器

目录

引言

RESP 协议

Redis 通信过程

实现步骤

步骤一

步骤二

步骤三

步骤四


引言

  • 在 Redis 命令行客户端中手敲命令并不是我们日常开发中的主要形式
  • 而更多的时候是使用 Redis 的 API 来实现定制化的 Redis 客户端程序,进而操作 Redis 服务器
  • 即使用程序来操作 Redis,使用代码来执行 Redis 命令

注意:

  • Redis 所提供的命令行客户端 抑或是 第三方的图形化客户端
  • 这二者本质上均属于 通用的客户端程序
  • 相比之下,我们在工作中更希望使用到的是 专用的、定制化 的客户端程序

RESP 协议

  • RESP(Redis Serialization Protocol) 协议,用于在 Redis 客户端和服务器之间进行通信

注意:

  • 正因为 Redis 官方开放了 RESP 协议,所以我们才能够基于该协议,来编写出一个自定义的 Redis 客户端

RESP 协议优点:

  • 简单且容易实现
  • 可快速解析
  • 肉眼可读

RESP 协议特点:

  • RESP 协议的实现通常基于 TCP,但并不意味着RESP 协议与 TCP 强耦合在一起,即也可选择其他传输层协议
  • 请求和响应之间的通信模型是一问一答的形式,即客户端给服务器发送一个请求,服务器返回一个响应

Redis 通信过程

  • 客户端向服务器发送 Redis 命令(Bulk String 数组形式发送)
  • 不同的命令,服务器返回不同的结果
  1. 有的命令,可能返回个 OK
  2. 有的命令,可能返回个 整数
  3. 有的命令,可能返回个 数组
数据类型首比特位实例理解
Simple String+"+OK\r\n"
Errors-"-Error message\r\n"
Integers:":1000\r\n"
Bulk Strings$"$5\r\nhello\r\n"
Arrays*"*2\r\n$5\r\nhello\r\n$5\r\nworld\r\n"
  • 即服务器在返回时,会将上述 实例字符串,写入到 tcp socket 中

注意:

  • Simple Sting 只能用来传输文本
  • Bulk Stirng 可以传输二进制数据

总结:

  • 因此 redis 服务器要做的工作就是
  1. 按照上述格式,构造出字符串,往 socket 中写入
  2. 从 socekt 中读取字符串,按照上述格式解析

  • 当然我们无需自己写代码,即按照按照上述的协议来 解析 和 构造字符串
  • 因为我们可以使用现成的库,这些库已经帮我们实现了这套协议的解析 和 构造
  • 因此我们便可以比较简单方便的来完成和 Redis 服务器通信的操作了!

实现步骤

  • 此处我们使用 jedis 库,因为 jedis 库所提供的 api 和 Redis 命令高度一致

步骤一

  • 在 maven 项目的 pom.xml 文件中添加依赖

<!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.4.2</version></dependency>

步骤二

  •  配置 ssh 端口转发,把云服务器的 Redis 端口,映射到本地主机


此处我们解释并理解步骤二,着急配置的可直接省略


  • 使用 Java 开发进行的代码,通常高度依赖 windows(IDEA)
  • 所以当我们想直接在自己主机上 操作 Redis 时,便需要通过 外网ip

  • 但是直接使用 外网ip 也无法访问到云服务器中的 Redis 服务器
  • 因为 Redis 服务器所占用的 6379 端口,默认被云服务器的防火墙给保护起来了
  • 而防火墙一旦将 6379 端口保护起来,不仅黑客访问不了,就连自己也无法访问 Redis 服务器

问题:

  • 直接在云服务器后台,把 6379 端口防火墙放开不就行了?

回答:

  • 千万不要这么做!
  • Redis 服务器的端口一旦放开到公网上,就特别容易被入侵!

两难境地:

  1. 不能开放 Redis 服务器的端口
  2. 我们自己又想能够通过外网对 Redis 服务器进行访问

解决方案一:

  • 直接让 java 程序在 linux 上运行
  • 这就需要我们将代码打成可执行的 jar 包,然后再将 jar 包拷贝到 linux 服务器上,最后再执行 jar 包
  • 如果按照上述操作一步一步完成,还是十分繁琐的
  • 虽然也可以通过一些第三方插件来简化上述步骤,但总体来说还是比较繁琐的!

解决方案二:

  • 配置 ssh 端口转发,把云服务器的 Redis 端口,映射到本地主机
  • ssh 的功能十分强大,其中很重要的特性就是能够支持端口转发
  • 相当于通过 22 端口,来传递其他端口的数据
  • 本身我们需要通过 windwos 主机来访问云服务器 6379 端口
  • 但是我们可以直接构造一个特殊的 ssh 数据报将要访问的 redis 请求放到 ssh 数据报中


步骤三

  • 当 ssh 连接上了之后,端口转发才会生效,即如歌将 ssh 连接断开,端口转发自然失效
  • 所以我们完成上述步骤后,便可以使用 netstat 命令观察本地 8888 端口是否被监听成功
  • 打开 cmd ,输入下方命令
netstat -ano | findstr 8888

  • 出现红框所示,表示配置成功!

注意:

  • 当配置了 端口转发之后,一定要断开之前的连接,重新连接才能生效!

步骤四

  • 此处将创建一个 RedisDemo 类,来测试操作云服务器的 Redis 
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;public class RedisDemo {public static void main(String[] args) {
//        连接到 redis 服务器上JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");//        从 redis 连接池中取一个出来
//        连接使用完之后要记得释放(close)
//        此处的释放不一定是真的关闭 tcp 连接,而是放回到池子里try (Jedis jedis = jedisPool.getResource()){
//            redis 的各种命令,就都对应到 jedis 对象的各种方法String pong = jedis.ping();System.out.println(pong);}}
}

运行结果:


注意点一:

  • 当前咱们的这个程序能跑通,除了配置 ssh 端口映射之外,还有一个要点
  • 即最开始安装 Redis 服务器时,配置好绑定的 ip ,以及关闭保护模式


想具体在 Centos7 上安装 Redis 5 可点击下方链接

关于云服务器 CentOS7 安装 Redis5


注意点二:

  • 上述 url 的写法仅局限于开发阶段,后续如果我们的程序需要部署到云服务器
  • 此时便需按照云服务的实际情况来更换此处的 ip 和 端口了



 

相关文章:

2024.1.9 基于 Jedis 通过 Java 客户端连接 Redis 服务器

目录 引言 RESP 协议 Redis 通信过程 实现步骤 步骤一 步骤二 步骤三 步骤四 引言 在 Redis 命令行客户端中手敲命令并不是我们日常开发中的主要形式而更多的时候是使用 Redis 的 API 来实现定制化的 Redis 客户端程序&#xff0c;进而操作 Redis 服务器即使用程序来操…...

软件测试|SQL ORDER BY排序利器使用

简介 在SQL查询语言中&#xff0c;ORDER BY子句是一项重要的功能&#xff0c;它允许我们按照指定的列或表达式对查询结果进行排序。本文将详细介绍SQL ORDER BY子句的用法、常见排序方式以及在实际应用中的应用场景。 ORDER BY子句 SQL是一种用于管理和操作关系型数据库的强…...

苹果手机IOS软件应用IPA砸壳包提取完整教程

我们有很多小伙伴可能想要获取到苹果手机软件的安装包但又不知该如何获取&#xff0c;本文就教你如何获取到IOS软件的IPA砸壳包 首先我们需要准备一台越狱的苹果IOS设备&#xff0c;如果不知如何越狱的可以参考这篇苹果手机越狱教程&#xff1a;https://www.hereitis.cn/artic…...

「 网络安全术语解读 」内容安全策略CSP详解

引言&#xff1a;什么是CSP&#xff0c;它为什么可以防御一些常见的网络攻击&#xff0c;比如XSS攻击&#xff0c;具体原理是什么&#xff1f;以及如何绕过CSP&#xff1f; 1. CSP定义 CSP&#xff08;Content Security Policy&#xff0c;内容安全策略&#xff09;是一种网络…...

Docker与微服务实战(基础篇)

Docker与微服务实战&#xff08;基础篇&#xff09; 1、Docker简介2、Docker安装步骤1.Centos7及以上的版本2.卸载旧版本3.yum安装gcc相关4.安装需要的软件包5.设置stable镜像仓库【国内aliyun】6.更新yum软件包索引--以后安装更快捷7.安装Docker-Ce8.启动Docker9.测试10.卸载1…...

「实用分享」如何用Telerik UI组件创建可扩展的企业级WPF应用?

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…...

【Docker基础三】Docker安装Redis

下载镜像 根据自己需要下载指定版本镜像&#xff0c;所有版本看这&#xff1a;Index of /releases/ (redis.io) 或 https://hub.docker.com/_/redis # 下载指定版本redis镜像 docker pull redis:7.2.0 # 查看镜像是否下载成功 docker images 创建挂载目录 # 宿主机上创建挂…...

【Flink精讲】Flink数据延迟处理

面试题&#xff1a;Flink数据延迟怎么处理&#xff1f; 将迟到数据直接丢弃【默认方案】将迟到数据收集起来另外处理&#xff08;旁路输出&#xff09;重新激活已经关闭的窗口并重新计算以修正结果&#xff08;Lateness&#xff09; Flink数据延迟处理方案 用一个案例说明三…...

vue项目心得(复盘)

在编写项目过程中&#xff0c;首先是接手一个需要优化的项目&#xff0c;需要查看vue.config.js环境配置地址&#xff0c;确认好测试地址后进行开发&#xff0c;目前在开发过程中&#xff0c;遇到的最多的问题就是关于组件间的&#xff0c; 组件间传值 1、父组件异步传值&…...

Linux——firewalld防火墙(一)

一、Linux防火墙基础 Linux 的防火墙体系主要工作在网络层.针对TCP/P数据包实时过滤和限制.属于典型的包过滤防火墙&#xff08;或称为网络层防火墙)。Linux系统的防火墙体系基于内核编码实现&#xff0e;具有非常稳定的性能和高效率,也因此获得广泛的应用.在CentOS 7系统中几种…...

JMeter之Windows安装

JMeter之Windows安装 一、安装JDK二、安装JMeter1、下载JMeter2、配置环境变量3、验证JMeter 三、扩展知识1、汉化 一、安装JDK 略 二、安装JMeter 1、下载JMeter 官网地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi 放到本地目录下 2、配置环境变量 变量…...

用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战

Retrieval-Augmented Generation&#xff08;RAG&#xff09;是一种强大的技术&#xff0c;能够提高大型语言模型&#xff08;LLM&#xff09;的性能&#xff0c;使其能够从外部知识源中检索信息以生成更准确、具有上下文的回答。 本文将详细介绍 RAG 在 LangChain 中的应用&a…...

正则表达式的语法

如果要想灵活的运用正则表达式&#xff0c;必须了解其中各种元素字符的功能&#xff0c;元字符从功能上大致分为&#xff1a; 限定符 选择匹配符 分组组合和反向引用符 特殊字符 字符匹配符 定位符 我们先说一下元字符的转义号 元字符(Metacharacter)-转义号 \\ \\ 符号…...

MyBatis分页插件的实现原理

MyBatis 分页插件的实现原理是通过拦截器&#xff08;Interceptor&#xff09;来实现的。拦截器可以在 SQL 执行前后对 SQL 进行拦截和处理。 简单来说&#xff0c;就是通过在查询语句中添加额外的参数和逻辑&#xff0c;以支持分页功能。它的核心思想是将分页参数传递给插件&…...

Winform、WPF如何解决前端卡死问题

在WinForms和WPF中&#xff0c;前端卡死问题通常是由于长时间的计算或阻塞操作导致的。以下是一些解决前端卡死问题的常见方法&#xff1a; 使用异步操作&#xff1a;将长时间的计算或阻塞操作放在后台线程中执行&#xff0c;以避免阻塞UI线程。可以使用Task、async/await等异步…...

python内app自动化测试的局限性,该如何破局?

Python在App自动化测试方面非常流行&#xff0c;尤其对于移动应用&#xff08;Android和iOS&#xff09;的测试&#xff0c;可以借助于像Appium、Robot Framework等工具进行跨平台自动化。然而&#xff0c;即使使用Python这样的强大语言&#xff0c;App自动化测试也存在一些局限…...

k8s的node亲和性和pod亲和性和反亲和性 污点 cordon drain

node亲和性和pod亲和性和反亲和性 污点 cordon drain 集群调度: schedule的调度算法 预算策略 过滤出合适的节点 优先策略 选择部署的节点 nodeName:硬匹配&#xff0c;不走调度策略&#xff0c;node01 nodeSelector:根据节点的标签选择&#xff0c;会走调度的算法 只…...

IntelliJ IDEA如何使用固定地址公网远程访问本地Mysql数据库

文章目录 1. 本地连接测试2. Windows安装Cpolar3. 配置Mysql公网地址4. IDEA远程连接Mysql小结 5. 固定连接公网地址6. 固定地址连接测试 IDEA作为Java开发最主力的工具&#xff0c;在开发过程中需要经常用到数据库&#xff0c;如Mysql数据库&#xff0c;但是在IDEA中只能连接本…...

GIT - 清除历史 Commit 瘦身仓库

目录 一.引言 二.仓库清理 ◆ 创建一个船新分支 ◆ 提交最新代码 ◆ 双指针替换分支 三.总结 一.引言 由于项目运行时间较长&#xff0c;分支较多&#xff0c;且分支内包含很多不同的大文件&#xff0c;随着时间的推移&#xff0c;历史 Git 库的容量日渐增发&#xff0c…...

物联网产品中,终端、网关、协议、PaaS、SaaS之间的关系

在互联网产品中&#xff0c;经常提到的终端、网关、协议、PaaS、SaaS之间&#xff0c;到底有什么关系呢&#xff1f; 一、基本概念 在百度/其他地方搜集的信息中&#xff0c;对于终端、网关、协议、PaaS、SaaS的解释各有不同&#xff0c;整理如下&#xff1a; 终端&#xff1…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...