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 数组形式发送)
- 不同的命令,服务器返回不同的结果
- 有的命令,可能返回个 OK
- 有的命令,可能返回个 整数
- 有的命令,可能返回个 数组
数据类型 首比特位 实例理解 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 服务器要做的工作就是
- 按照上述格式,构造出字符串,往 socket 中写入
- 从 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 服务器的端口一旦放开到公网上,就特别容易被入侵!
两难境地:
- 不能开放 Redis 服务器的端口
- 我们自己又想能够通过外网对 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 客户端程序,进而操作 Redis 服务器即使用程序来操…...
软件测试|SQL ORDER BY排序利器使用
简介 在SQL查询语言中,ORDER BY子句是一项重要的功能,它允许我们按照指定的列或表达式对查询结果进行排序。本文将详细介绍SQL ORDER BY子句的用法、常见排序方式以及在实际应用中的应用场景。 ORDER BY子句 SQL是一种用于管理和操作关系型数据库的强…...
苹果手机IOS软件应用IPA砸壳包提取完整教程
我们有很多小伙伴可能想要获取到苹果手机软件的安装包但又不知该如何获取,本文就教你如何获取到IOS软件的IPA砸壳包 首先我们需要准备一台越狱的苹果IOS设备,如果不知如何越狱的可以参考这篇苹果手机越狱教程:https://www.hereitis.cn/artic…...
「 网络安全术语解读 」内容安全策略CSP详解
引言:什么是CSP,它为什么可以防御一些常见的网络攻击,比如XSS攻击,具体原理是什么?以及如何绕过CSP? 1. CSP定义 CSP(Content Security Policy,内容安全策略)是一种网络…...
Docker与微服务实战(基础篇)
Docker与微服务实战(基础篇) 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个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成Visual Studio…...
【Docker基础三】Docker安装Redis
下载镜像 根据自己需要下载指定版本镜像,所有版本看这:Index of /releases/ (redis.io) 或 https://hub.docker.com/_/redis # 下载指定版本redis镜像 docker pull redis:7.2.0 # 查看镜像是否下载成功 docker images 创建挂载目录 # 宿主机上创建挂…...
【Flink精讲】Flink数据延迟处理
面试题:Flink数据延迟怎么处理? 将迟到数据直接丢弃【默认方案】将迟到数据收集起来另外处理(旁路输出)重新激活已经关闭的窗口并重新计算以修正结果(Lateness) Flink数据延迟处理方案 用一个案例说明三…...
vue项目心得(复盘)
在编写项目过程中,首先是接手一个需要优化的项目,需要查看vue.config.js环境配置地址,确认好测试地址后进行开发,目前在开发过程中,遇到的最多的问题就是关于组件间的, 组件间传值 1、父组件异步传值&…...
Linux——firewalld防火墙(一)
一、Linux防火墙基础 Linux 的防火墙体系主要工作在网络层.针对TCP/P数据包实时过滤和限制.属于典型的包过滤防火墙(或称为网络层防火墙)。Linux系统的防火墙体系基于内核编码实现.具有非常稳定的性能和高效率,也因此获得广泛的应用.在CentOS 7系统中几种…...
JMeter之Windows安装
JMeter之Windows安装 一、安装JDK二、安装JMeter1、下载JMeter2、配置环境变量3、验证JMeter 三、扩展知识1、汉化 一、安装JDK 略 二、安装JMeter 1、下载JMeter 官网地址:https://jmeter.apache.org/download_jmeter.cgi 放到本地目录下 2、配置环境变量 变量…...
用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战
Retrieval-Augmented Generation(RAG)是一种强大的技术,能够提高大型语言模型(LLM)的性能,使其能够从外部知识源中检索信息以生成更准确、具有上下文的回答。 本文将详细介绍 RAG 在 LangChain 中的应用&a…...
正则表达式的语法
如果要想灵活的运用正则表达式,必须了解其中各种元素字符的功能,元字符从功能上大致分为: 限定符 选择匹配符 分组组合和反向引用符 特殊字符 字符匹配符 定位符 我们先说一下元字符的转义号 元字符(Metacharacter)-转义号 \\ \\ 符号…...
MyBatis分页插件的实现原理
MyBatis 分页插件的实现原理是通过拦截器(Interceptor)来实现的。拦截器可以在 SQL 执行前后对 SQL 进行拦截和处理。 简单来说,就是通过在查询语句中添加额外的参数和逻辑,以支持分页功能。它的核心思想是将分页参数传递给插件&…...
Winform、WPF如何解决前端卡死问题
在WinForms和WPF中,前端卡死问题通常是由于长时间的计算或阻塞操作导致的。以下是一些解决前端卡死问题的常见方法: 使用异步操作:将长时间的计算或阻塞操作放在后台线程中执行,以避免阻塞UI线程。可以使用Task、async/await等异步…...
python内app自动化测试的局限性,该如何破局?
Python在App自动化测试方面非常流行,尤其对于移动应用(Android和iOS)的测试,可以借助于像Appium、Robot Framework等工具进行跨平台自动化。然而,即使使用Python这样的强大语言,App自动化测试也存在一些局限…...
k8s的node亲和性和pod亲和性和反亲和性 污点 cordon drain
node亲和性和pod亲和性和反亲和性 污点 cordon drain 集群调度: schedule的调度算法 预算策略 过滤出合适的节点 优先策略 选择部署的节点 nodeName:硬匹配,不走调度策略,node01 nodeSelector:根据节点的标签选择,会走调度的算法 只…...
IntelliJ IDEA如何使用固定地址公网远程访问本地Mysql数据库
文章目录 1. 本地连接测试2. Windows安装Cpolar3. 配置Mysql公网地址4. IDEA远程连接Mysql小结 5. 固定连接公网地址6. 固定地址连接测试 IDEA作为Java开发最主力的工具,在开发过程中需要经常用到数据库,如Mysql数据库,但是在IDEA中只能连接本…...
GIT - 清除历史 Commit 瘦身仓库
目录 一.引言 二.仓库清理 ◆ 创建一个船新分支 ◆ 提交最新代码 ◆ 双指针替换分支 三.总结 一.引言 由于项目运行时间较长,分支较多,且分支内包含很多不同的大文件,随着时间的推移,历史 Git 库的容量日渐增发,…...
物联网产品中,终端、网关、协议、PaaS、SaaS之间的关系
在互联网产品中,经常提到的终端、网关、协议、PaaS、SaaS之间,到底有什么关系呢? 一、基本概念 在百度/其他地方搜集的信息中,对于终端、网关、协议、PaaS、SaaS的解释各有不同,整理如下: 终端࿱…...
6款实用的Git可视化管理工具
前言 俗话说得好“工欲善其事,必先利其器”,合理的选择和使用可视化的管理工具可以降低技术入门和使用门槛。我们在团队开发中统一某个开发工具能够降低沟通成本,提高协作效率。今天给大家分享6款实用的Git可视化管理工具。 Git是什么&…...
python_selenium零基础爬虫学习案例_知网文献信息
案例最终效果说明: 去做这个案例的话是因为看到那个博主的分享,最后通过努力,我基本实现了进行主题、关键词、更新时间的三个筛选条件去获取数据,并且遍历数据将其导出到一个CSV文件中,代码是很简单的,没有…...
MindSpore Serving基于昇腾910B实现大模型部署
一、Why MindSpore Serving 大模型时代,作为一个开发人员更多的是关注一个大模型如何训练好、如何调整模型参数、如何才能得到一个更高的模型精度。而作为一个整体项目,只有项目落地才能有其真正的价值。那么如何才能够使得大模型实现落地?如…...
mysql原理--InnoDB的Buffer Pool
1.缓存的重要性 对于使用 InnoDB 作为存储引擎的表来说,不管是用于存储用户数据的索引(包括聚簇索引和二级索引),还是各种系统数据,都是以 页 的形式存放在 表空间 中的,而所谓的 表空间 只不过是 InnoDB 对…...
Redis不同环境缓存同一条数据,数据内部值不同
背景 现实中,本地环境(dev)和开发环境(feature)会共同使用相同的中间件(本篇拿Redis举例),对于不同环境中的,图片、视频、语音等资源类型的预览地址url,需要配…...
MySQL之导入、导出远程备份
一、Navicat工具导入、导出 1.1 导入 第一步: 右键,点击运行SQL文件 第二步: 选择要运行的SQL,点击开始 第三步: 关闭即可 1.2 导出 第一步: 右键选择,导出向导 第二步: 选择SQL脚…...
OpenGL学习笔记-Blending
混合方程中,Csource是片段着色器输出的颜色向量(the color output of the fragment shader),其权重为Fsource。Cdestination是当前存储在color buffer中的颜色向量(the color vector that is currently stored in the …...
支持 input 函数的在线 python 运行环境 - 基于队列
支持 input 函数的在线 python 运行环境 - 基于队列 思路两次用户输入三次用户输入 实现前端使用 vue element uiWindows 环境的执行器子进程需要执行的代码 代码仓库参考 本文提供了一种方式来实现支持 input 函数,即支持用户输的在线 python 运行环境。效果如下图…...
欧拉Euler release 21.10 (LTS-SP2)升级openssh至9版本记录
背景:安扫漏洞,需要对openssh经行升级 1.先查看升级前的openssh版本 2.避免升级失败断开远程登录,先开启telnt服务用于远程连接(这步可查看其他博客) 3.从欧拉官网下载rpm包,https://www.openeuler.org/zh…...
php 数组中的元素进行排列组合
需求背景:计算出数组[A,B,C,D]各种排列组合,希望得到的是数据如下图 直接上代码: private function finish_combination($array, &$groupResult [], $splite ,){$result [];$finish_result [];$this->diffArrayItems($array, $…...
做文库类网站/seo站长平台
一、 导入画册 选好照片,点击画册 二、 画册设置 2.1、 画册 PDF:印刷店格式JEPG:网上印刷格式 2.2、 大小 相册的大小一般选择方形 2.3、 封面 2.4、 其他 三、 布局 3.1、去除布局 3.2、自动布局 3.3、预设 四、 页面 4.1、页面…...
做网站做软件怎么赚钱吗/全自动推广软件
1.输出函数 - print 用法一:print(数据) 在控制台打印指定数据,打印结束后会自动换行 print(你好世界)用法二:print(数据1,数据2,数据3,…) 一行同时打印多个数据,每个数据空格隔开…...
seo短期培训班/英语seo
美国《福布斯》双周刊网站5月24日刊载题为《到2023年区块链解决方案支出可能超过160亿美元》的文章,作者系卢克菲茨帕特里克,文章认为区块链将给四大行业带来巨变。 这是1月8日在美国拉斯维加斯消费电子展上拍摄的欧姆龙公司的HeartGuide可穿戴设备。美…...
江西南昌今日疫情/酒店seo是什么意思
为什么80%的码农都做不了架构师?>>> 定义变量$string”this_is_a_test” ${#string} : 取字符串长度,空格也算 ${string:position} : 从positon处提取字符串,positon从0开始.也可以认为是提取postion之后字符串,不算p…...
无锡网站制作公司/李飞seo
原博文 2017-05-17 12:04 − 在pycharm中的Python代码运行会出现各种奇葩的问题,比如,密码输入时不显示或没有提示,给我们带来一些麻烦,下面介绍几种代码运行的几种方式: 一、直接运行(Run按钮或者快捷键sh…...
53套网站源码/网站设计的毕业论文
Python入门从哪开始,90%以上的书上都是这样讲的:先介绍 Python 的基本语法规则、list、dict、tuple 等数据结构,然后再介绍字符串处理和正则表达式,介绍文件等IO操作.... 就这样一点一点往下说。然而这种按部就班的学习方法&#…...