当前位置: 首页 > 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…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...