Redis客户端

1.前言

前面学习的Redis的基本操作和命令都是在redis命令行手动执行的,更多的时候,是使用redis的API来实现定制化的redis客户端操作redis服务器。接下来我们要了解Redis服务端和客户端的通信协议,以及Java语言的Redis客户端使用方法

Redis服务器在官网上公开了使用的协议RESP,任何一个第三方都可以通过上述协议,来实现一个和redis服务器通信的客户端程序

Java生态中,封装了RESP协议,实现的redis客户端有很多的,接下来我们使用的时Jedis

2.端口转发

这样的结构,就需要通过云服务器的外网IP来访问到Linux服务器。但是只修改外网IP是不够的,因为6379端口默认情况下是被服务器的防火墙给保护起来的,不能被外界访问(包括我们自己)

HajiHang的电脑就好比小区里的住宅楼,被NAT机制保护起来了,有人想偷东西,成本就会非常高,小偷得先想办法进入小区,然后再想办法进入单元楼,再想办法进HajiHang家;云服务器就是有外网IP的,云服务器就相当于暴露在大街上的门市房,有人相偷东西,成本就比较低了,只需要想办法进去即可,每给服务器开放一个端口,就好比开了一扇大门,开放的端口多了,门就多了,小偷进入的几率就更大了

那么就有人要说了直接在云服务器后台,把防火墙放开,不就行了嘛?                                           ·不行!!!Redis的端口一旦公开到公网上,就特别容易被入侵!

那么就又有人要问了tomcat的端口号不也是公开到公网上的?                                                          ·虽然tomcat端口也开放了,但是tomcat的8080这个“锁”是不好撬开的,而Redis的6379这个“锁”就是很好撬开的!

还有人要问那我给redis换个端口是不是就安全了呢??                                                                    ·不安全,这种方式就相当于掩耳盗铃!

不能开放Redis端口号,我们又想要能够通过外网访问,有一下两种方式:

1.直接让Java程序也在Linux上运行

这就需要将代码打包成一个可执行的jar包,然后将jar包拷贝到Linux服务器上执行

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

ssh功能非常强大,其中非常重要的特性就是能够支持端口转发,想当于通过ssh的22端口,来传递其他端口的数据

本身我们就是通过Windows主机,访问云服务器的6379端口,于是构造一个特殊的ssh数据报就把要访问的redis请求,放到ssh数据包中

 这个数据就会通过22端口号发送给服务器,服务器的ssh服务器程序就能够协议出上述的数据报,然后包数据报交给6379端口的程序

一个Linux主机上,存在的服务器有很多,ssh也可能需要来给多个端口传递数据,这个时候,为了区分不同的端口,往往会把服务器端口在本地用另一个端口进行表示

3.Java使用Redis步骤

3.1 导入依赖

Java操作Redis客户端有很多,其中最知名的是Jedis

创建maven项目,把Jedis的依赖拷贝到pom.xml中

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

3.2 配置端口转发

Redis服务器安装在云服务器上,而我们编写的代码则是在本地主机,要想让本地主机能访问Redis,需要把Redis的端口通过云服务器后台页面的“防火墙/安全组”放开短空到公网上,但是这个操作非常危险(黑客很容易获取Redis中的内容)

因此我们可以通过端口转发方式,直接把服务器的Redis端口映射到本地

在Xshell中,进行如下配置:

1.右键服务器的会话,选择属性

2.找到隧道,配置转移规则

连接完成之后,就可以使用netstat命令查看本地这里的8888端口与有了没

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

3.使用会话连接服务器

此时,访问本地8888就相当于访问对应服务器的6379,同时外面的客户端是无法直接访问云服务器的6379的

注意:Xshell和服务器必须处于连接状态,这样的映射才是有效的

3.3 连接Redis Server

使用JedisPool描述Redis服务器的位置,使用url表示

使用getResource和服务器建立连接

连接使用完毕需要close关闭,也可以直接使用try自动关闭

通过ping方法可以检测连接是否正确建立

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;public class RedisDemo {public static void main(String[] args) {//后续如果我们的程序部署到云服务器此时就得按照云服务器的实际情况,来写ip和端口号JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");try(Jedis jedis=jedisPool.getResource()){String ping=jedis.ping();System.out.println(ping);}}
}

运行结果

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

通过cd /etc/redis ,以及vim redis.conf编辑Redis配置文件

这里默认绑定的ip是127.0.0.1此时只能本机和本机访问,不能跨主机访问

这里默认是yes,开启保护模式,跨主机也是不能访问的

4.基础操作

4.1 set和get

key不存在时,得到的value为null

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;public class RedisDemo {private static void testGetAndSet(Jedis jedis){jedis.set("key1","value1");jedis.set("key2","value2");String value1=jedis.get("key1");System.out.println(value1);String value2=jedis.get("key2");System.out.println(value2);String value3=jedis.get("NoSuchKey");System.out.println(value3);}public static void main(String[] args) {//后续如果我们的程序部署到云服务器此时就得按照云服务器的实际情况,来写ip和端口号JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");try(Jedis jedis=jedisPool.getResource()){testGetAndSet(jedis);}}
}

运行结果:

 通过Xshell观察:

 

4.2 exists和del

del可以删除多个key,以及边长参数列表(要求边长参数必须是相同数据类型的,会代用类型检查),返回值是实际删除的key的个数

exists检测key是否存在,如果key存在返回true,如果key不存在则返回false

private static void testExistsAndDel(Jedis jedis){//避免之前其他的操作产生的数据对本次操作产生影响jedis.flushAll();jedis.set("key1","value");jedis.set("key2","value");jedis.set("key3","value");boolean ret=jedis.exists("key1");System.out.println(ret);long n=jedis.del("key1");System.out.println(n);n=jedis.del("key1","key2","key3");System.out.println(n);
}

 运行结果

 

4.3 keys

获取符合条件的key

 private static void  testKeys(Jedis jedis){jedis.flushAll();jedis.set("key1","value1");jedis.set("key2","value2");jedis.set("key3","value3");jedis.set("key4","value4");jedis.set("myKey","value5");Set<String> set=jedis.keys("*");System.out.println(set);set=jedis.keys("key?");System.out.println(set);
}

运行结果

 

4.4 expire和ttl

设置过期时间和获取剩余生存时间

 private static void testExpireAndTtl(Jedis jedis) throws InterruptedException {jedis.flushAll();jedis.set("key1","value");jedis.expire("key1",10);long ttl= jedis.ttl("key1");System.out.println(ttl);Thread.sleep(8000);ttl= jedis.ttl("key1");System.out.println(ttl);Thread.sleep(3000);ttl= jedis.ttl("key1");System.out.println(ttl);
}

 运行结果:

 

4.5 type

打印key对应的value的类型

private static void testType(Jedis jedis){jedis.set("key1","value1");System.out.println(jedis.type("key1"));jedis.lpush("key2","a","b","c");System.out.println(jedis.type("key2"));jedis.hset("key3","name","hajiHang");System.out.println(jedis.type("key3"));jedis.sadd("key4","111","222","333");System.out.println(jedis.type("key4"));jedis.zadd("key5",89,"lll");System.out.println(jedis.type("key5"));
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30560.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git基础之分支

常用指令 git branch 列出本地所有分支 git branch -r 列出所有远程分支 git branch [branch-name] 新建一个分支&#xff0c;但依然停留在当前分支 git checkout -b [branch] 新建一个分支&#xff0c;并切换到该分支 git merge [branch] 合并指定分支当前分支 git branch -d …

Java多线程与高并发专题——什么是阻塞队列?

引入 阻塞队列&#xff08;Blocking Queue&#xff09;是一种线程安全的队列数据结构&#xff0c;它的主要特点是&#xff1a; 线程安全&#xff1a;多个线程可以安全地同时访问队列。阻塞操作&#xff1a;当队列为空时&#xff0c;从队列中获取元素的操作会被阻塞&#xff0…

电路常用常用的定理/定律/计算方法

1、欧姆定理 在恒定温度下&#xff0c;导体中的电流I与导体两端的电压U成正比&#xff0c;与导体的电阻R成反比。 2、基尔霍夫定律 2.1基尔霍夫电流定律&#xff08;KCL&#xff09; 在电路中任何一个节点上&#xff0c;任意时刻&#xff0c;流入节点的电流之和等于流出节点…

unity 让两个物体相遇时候刚体互不影响

解决方案是设定好层级不同&#xff0c;在PlayerSetting中找到物理&#xff0c;有一个图层碰撞矩阵 取消对应 勾选即可 如图

编译Telegram Desktop

目录 一、前言 二、环境准备 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 三、编译 四、总结和学习 一、前言 Telegram 是一款全球广泛使用的即时通讯软件&#xff0c;以其强大的隐私保护、跨平台同步和丰富的功能而闻名。它支持一对一聊天、群组&#xff08;最多20万成员&am…

(十七) Nginx解析:架构设计、负载均衡实战与常见面试问题

什么是Nginx? Nginx 是一款高性能的 HTTP 服务器和反向代理服务器&#xff0c;同时支持 IMAP/POP3/SMTP 协议。其设计以高并发、低资源消耗为核心优势&#xff0c;广泛应用于负载均衡、静态资源服务和反向代理等场景。 一、Nginx 的核心优势 高并发处理能力采用异步非阻塞的…

PCIE接口

PCIE接口 PIC接口介绍PIC总线结构PCI总线特点PCI总线的主要性能PIC的历程 PCIE接口介绍PCIe接口总线位宽PCIE速率GT/s和Gbps区别PCIE带宽计算 PCIE架构PCIe体系结构端到端的差分数据传递PCIe总线的层次结构事务层数据链路层物理层PCIe层级结构及功能框图 PCIe链路初始化PCIe链路…

边缘计算盒子:解决交通拥堵的智能方案

在当今的智能交通系统中&#xff0c;边缘计算盒子&#xff08;Edge Computing Box&#xff09;正逐渐成为不可或缺的核心组件。这种设备通过将计算能力下沉到网络边缘&#xff0c;极大地提升了数据处理的速度和效率&#xff0c;特别适用于实时性要求极高的交通监控场景。本文将…

INFINI Labs 产品更新 | Easysearch 增加异步搜索等新特性

INFINI Labs 产品更新发布&#xff01;此次更新&#xff0c;Easysearch 增加了新的功能和数据类型&#xff0c;包括 wildcard 数据类型、Point in time 搜索 API、异步搜索 API、数值和日期字段的 doc-values 搜索支持&#xff0c;Console 新增了日志查询功能。 INFINI Easyse…

Kotlin从入门到精通:开启高效编程之旅

目录 一、为什么选择 Kotlin 二、Kotlin 基础语法入门​ 2.1 Hello, Kotlin​ 2.2 变量与数据类型​ 2.2.1 可变与不可变变量​ 2.2.2 基本数据类型​ 2.2.3 数组​ 三、Kotlin 流程控制与函数​ 3.1 流程控制语句​ 3.1.1 if 表达式​ 3.1.2 when 表达式​ 3.2 函…

大模型量化技术实践指南:GPTQ、AWQ、BitsandBytes 和 Unsloth

在大模型&#xff08;LLM&#xff09;的时代&#xff0c;我们需要了解量化技术&#xff0c;以便在本地电脑上运行这些模型&#xff0c;因为它们的规模非常庞大。然而&#xff0c;实现量化的方法有很多&#xff0c;这让像我这样的初学者很容易感到困惑。本文介绍了我们必须掌握的…

C51 Proteus仿真实验16:4X4矩阵键盘控制条形LED显示

说明 按下的按键值越大点亮的LED越多 Proteus仿真 注意&#xff1a; K1、K5、K9、K13左边引脚连接的是P1.0 K2、K6、K10、K14左边引脚连接的是P1.1 K3、K7、K11、K15左边引脚连接的是P1.2 K4、K8、K12、K16左边引脚连接的是P1.3 K1、K2、K3、K4右边引脚连接的是P1.4 K5、K6、…

Hive的架构

1. 概念 Hive 是建立在 Hadoop 上的数据仓库工具&#xff0c;旨在简化大规模数据集的查询与管理。它通过类 SQL 语言&#xff08;HiveQL&#xff09;将结构化数据映射为 Hadoop 的 MapReduce&#xff0c;适合离线批处理&#xff0c;尤其适用于数据仓库场景。 2. 数据模型 表&a…

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 题目 解析代码 题目 解析 首先先让所有的f&#xff08;i&#xff09;i&#xff0c;即每个人最开始的祖先都是自己&#xff0c;然后就每一次都让轮到那个数的父亲1&#xff0c;第二次出现的时候就直接用父亲替换掉 并查集适用场景 …

GitHub上传项目

总结&#xff08;有基础的话直接执行这几步&#xff0c;就不需要再往下看了&#xff09;&#xff1a; git init 修改git的config文件&#xff1a;添加:[user]:name你的github用户名 email你注册github的用户名 git branch -m master main git remote add origin 你的URL gi…

关于Windows输入法切换的一些总结

语言和键盘的关系&#xff08;第一层是语言 语言下一层是键盘&#xff09; 如下图&#xff1a;语言就是 中文 英文 阿拉伯文之类的 键盘就是 语言中文下的&#xff1a;XX输入法 语言的切换 和 键盘&#xff08;输入法&#xff09;的切换 &#xff08;用windos空格 可以切换…

C# Unity 唐老狮 No.7 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…

搜广推校招面经三十九

小红书&#xfe63;图搜 一、两个整数的汉明距离 两个整数之间的汉明距离是指这两个数字对应二进制位相同位置不同的个数。换句话说&#xff0c;它就是将一个整数变成另一个整数所需要改变的二进制位的数量。例如&#xff0c;如果两个整数在它们的二进制表示中有三个位置上的…

conda list <package> 指令输出的build和channel含义

Build&#xff1a;表示当前安装包的 构建版本&#xff0c;即该包的编译、构建、发布的具体版本。通常包含一些额外的标识&#xff0c;帮助你区分同一包的不同版本。 Channel&#xff1a; 表示该包的 来源渠道&#xff0c;即该包是从哪个 Anaconda 仓库&#xff08;频道&#…

Windows下配置Flutter移动开发环境以及AndroidStudio安装和模拟机配置

截止 2025/3/9 &#xff0c;版本更新到了 3.29.1 &#xff0c;但是为了防止出现一些奇怪的bug&#xff0c;我安装的还是老一点的&#xff0c;3.19&#xff0c;其他版本的安装同理。AndroidStudio用的是 2024/3/1 版本。 — 1 环境变量&#xff08;Windows&#xff09; PUB_H…