七. Redis 当中 Jedis 的详细刨析与使用

devtools/2025/2/4 7:04:41/

七. Redis 当中 Jedis 的详细刨析与使用

文章目录

  • 七. Redis 当中 Jedis 的详细刨析与使用
  • 1. Jedis 概述
  • 2. Java程序中使用Jedis 操作 Redis 数据
    • 2.1 Java 程序使用 Jedis 连接 Redis 的注意事项
    • 2.2 Java程序通过 Jedis当中操作 Redis 的 key 键值对
    • 2.3 Java程序通过 Jedis 当中操作 Redis 的 string 字符串
    • 2.4 Java程序通过 Jedis 当中操作 Redis 的 list 列表
    • 2.5 Java程序通过 Jedis 当中操作 Redis 的 set 集合
    • 2.6 Java程序通过 Jedis 当中操作 Redis 的 hash 哈希表
    • 2.7 Java程序通过 Jedis 当中操作 Redis 的 Zset 有序集合
  • 3. 最后:


1. Jedis 概述

Jedis 是 Java程序操作 Redis 的工具,就像Java操作MySQL时的JDBC一样的功能

Jedis 工作示意图:

在这里插入图片描述

Jedis 的API 文档: https://www.javadoc.io/doc/redis.clients/jedis/latest/index.html

在这里插入图片描述

下面是来自一位网上网友总结的 Jedis中文文档:这里搬运了一下: https://blog.csdn.net/CYY941027/article/details/109110455

创建 Jedis 对象,使用对应的构造器:

在这里插入图片描述

键值对的操作:

在这里插入图片描述

字符串操作:

在这里插入图片描述

整数和浮点数操作:

在这里插入图片描述

列表List 操作:

在这里插入图片描述

集合(Set) 操作:

在这里插入图片描述

哈希表(Hash) 操作:

在这里插入图片描述

有序集合(Zsort) 操作:

在这里插入图片描述

排序操作:

在这里插入图片描述

我们可以观察到上述 API 的方法,可以明显的发觉这些就是我们在 Redis 当中敲的命令,只不过是被替换成了Java当中的方法使用了。因为我们是要在Java程序当中操作 Redis 的,所以自然是要将命令转换为Java当中的方法来操作。

2. Java程序中使用Jedis 操作 Redis 数据

快速入门:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们想要使用 jedis 需要在 pom.xml 文件当中引入相关的 jar 依赖。

在这里插入图片描述

<dependencies><!--        引入 jedis 依赖--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.2.0</version></dependency></dependencies>

Java 程序通过 Jedis 连接数据库之前,需要先将 Linux 当中安装的 Redis 服务器启动起来。

[root@localhost bin]# redis-server /etc/redis.conf # 启动 redis 服务器
[root@localhost bin]# redis-cli # 进入到 Redis 客户端

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.1 Java 程序使用 Jedis 连接 Redis 的注意事项

在这里插入图片描述

java">package com.rainbowsea.jedis;import org.junit.Test;
import redis.clients.jedis.Jedis;public class JedisTest {// 连接 Redis@Testpublic void con() {// 使用 ip地址 + redis的端口的构造器方法Jedis jedis = new Jedis("192.168.76.145", 6379);String ping = jedis.ping();System.out.println("连接成功 ping 返回的结果 = " + ping);jedis.close();  // 关闭连接}
}

ip地址没错,我们是复制过来的。端口号也没错,是默认的6379 。可显示连接不上。同时还提示我们连接超时了。

在这里插入图片描述

原因和解决方法:

  1. 第一个原因是:我们 Linux 当中的对于 6379 这个端口的防火墙是关闭的。如果防火墙是对于该 6379 端口是关闭,不是开放的。我们外界是无法连接上该端口的。所以我们需要在 Linux 当中将该 6379 端口打开开启。让我们外界(Java 程序)可以连接该 6379端口。

具体操作如下:

[root@localhost bin]# firewall-cmd --list-all

在这里插入图片描述

设置开放的端口号:

[root@localhost bin]# firewall-cmd --add-port=6379/tcp --permanent

在这里插入图片描述

注意:设置后开放端口以后,还得重启一下防火墙才能生效。

重启防火墙:

[root@localhost bin]# firewall-cmd --reload # 重启防火墙

在这里插入图片描述

再次执行 firewall-cmd --list-all 命令查看是否,将 6379 端口打开成功。

[root@localhost bin]# firewall-cmd --list-all

在这里插入图片描述

  1. 第二个原因:在Redis 当中的 /etc/redis.conf 文件当中,存在一个 bind ,设置:我们需要将其设置为远程访问的设置。而不是本机设置。

使用 vim 打开该文件,进行修改。

[root@localhost bin]# vim /etc/redis.conf

在这里插入图片描述

在这里插入图片描述

# bind 127.0.0.1 -::1

同样修改了配置之后,需要关闭 Redis 服务,再启动 Redis 服务,配置才能生效。

[root@localhost ~]# redis-cli -p 6379 shutdown # 关闭 Redis 服务
[root@localhost bin]# redis-server /etc/redis.conf # 重启Redis 服务器

在这里插入图片描述

  1. 第三个原因:我们还需要将 protected-mode yes 修改为 no 关闭保护模式,如下图所示
protected-mode no

在这里插入图片描述

同样修改了配置之后,需要关闭 Redis 服务,再启动 Redis 服务,配置才能生效。

我们再次尝试在Java程序当中连接 Redis 。

在这里插入图片描述

  1. Redis 默认是没有配置密码的,但是,没有密码的话,我们 Jedis 会认为是不安全的。我们为 Redis 配置密码。在 /etc/redis.conf 文件当中的 requirepass 配置密码。如下图所示:
 requirepass rainbowsea

在这里插入图片描述

同样修改了配置之后,需要关闭 Redis 服务,再启动 Redis 服务,配置才能生效。

设置密码后:使用 auth 密码 登录。

在这里插入图片描述

在这里插入图片描述

我们再次尝试在Java程序当中连接 Redis 。

注意: 这里我们 Redis 设置了密码,所以我们Java程序连接的时候,需要先执行 auth() 方法进行一个认证登录,才能连接上 Redis 服务。不然是无法连接数上的。

在这里插入图片描述

java">package com.rainbowsea.jedis;import org.junit.Test;
import redis.clients.jedis.Jedis;public class JedisTest {// 连接 Redis// 1. 如果Redis 设置了密码,则需要进行身份校验// 2. 因为需要连接到 redis端口,比如6379,就需要配置防火墙,放开端口// 3. 注意修改 bind ,支持远程连接// 4 注意关闭保护模式,protected-mode no ,no表示关闭// 5. 注意:设置了密码,需要执行 auth(密码)进行身份验证@Testpublic void con() {// 使用 ip地址 + redis的端口的构造器方法Jedis jedis = new Jedis("192.168.76.145", 6379);// 如果Redis 配置了密码,则需要进行身份校验jedis.auth("rainbowsea");String ping = jedis.ping();System.out.println("连接成功 ping 返回的结果 = " + ping);jedis.close();  // 关闭当前连接,注意并没有关闭 Redis}
}

2.2 Java程序通过 Jedis当中操作 Redis 的 key 键值对

在 Redis 当中是什么命令操作 key的,那么在Java程序中就以该命令的方法操作 key

在这里插入图片描述

在这里插入图片描述

java">
import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.Set;public class JedisTest {// key 操作@Testpublic void key() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");jedis.set("k1", "v1");jedis.set("k2", "v2");jedis.set("k3", "v3");// 获取keySet<String> keys = jedis.keys("*");for (String key : keys) {System.out.println("key=>" + key);}// 判断 key 是否存在System.out.println("exists:" + jedis.exists("k1")); // TrueSystem.out.println("exists: " + jedis.exists("k99"));// ttlSystem.out.println("ttl:" + jedis.ttl("k2"));System.out.println("k3 = " + jedis.get("k3")); // v3jedis.close();// 关闭当前连接}
}

2.3 Java程序通过 Jedis 当中操作 Redis 的 string 字符串

在这里插入图片描述

java">
import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.List;
import java.util.Set;public class JedisTest {// string 操作@Testpublic void string() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");// 批量设置k-vjedis.mset("s1","jack","s2","scott","s3","rainbow");// 批量获取List<String> mget = jedis.mget("s1", "s2");for (String s : mget) {System.out.println("s -> " + s);}jedis.close();}
}

2.4 Java程序通过 Jedis 当中操作 Redis 的 list 列表

在这里插入图片描述

java">
import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.List;
import java.util.Set;public class JedisTest {// list 操作@Testpublic void list() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");// 添加 list 数据jedis.lpush("name_list", "jack", "tom", "nono");List<String> nameList = jedis.lrange("name_list", 0, -1);for (String name : nameList) {System.out.println("name -->" + name);}jedis.close();}
}

2.5 Java程序通过 Jedis 当中操作 Redis 的 set 集合

在这里插入图片描述

java">
import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.List;
import java.util.Set;public class JedisTest {// set 操作@Testpublic void set() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");jedis.sadd("city","北京","上海");jedis.sadd("city","广州");jedis.sadd("city","深圳");Set<String> smembers = jedis.smembers("city");for (String city : smembers) {System.out.println("city -->" + city);}jedis.close(); // 关闭连接}
}

2.6 Java程序通过 Jedis 当中操作 Redis 的 hash 哈希表

在这里插入图片描述

java">
import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.List;
import java.util.Set;public class JedisTest {// hash操作@Testpublic void hash() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");jedis.hset("hash01", "name", "李白");jedis.hset("hash01", "age", "18");// 获取hash 的值String name = jedis.hget("hash01", "name");System.out.println("name - >" + name);jedis.close();}
}

也可以先构建一个 Java的 map,然后再加入到 Redis 当中的 hash 值当中。

在这里插入图片描述

java">
import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;public class JedisTest {// hash操作@Testpublic void hash2() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");// 先构建一个Java的mapMap<String, String> maps = new HashMap<>();maps.put("job", "Java工程师");maps.put("name", "李华");maps.put("emial", "lihua@qq.com");jedis.hset("hash02", maps);// 获取hash 的值List<String> person = jedis.hmget("hash02", "name", "job", "emial");for (String s : person) {System.out.println("s = >" + s);}jedis.close();}
}

2.7 Java程序通过 Jedis 当中操作 Redis 的 Zset 有序集合

在这里插入图片描述

java">
import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;public class JedisTest {// zset 有序集合操作@Testpublic void zset() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");jedis.zadd("heros", 1, "关羽");jedis.zadd("heros", 2, "张飞");jedis.zadd("heros", 3, "赵云");jedis.zadd("heros", 4, "马超");jedis.zadd("heros", 5, "黄忠");// 取出Set<String> heros = jedis.zrange("heros", 0, -1);  // 默认是升序(根据 score 评分值升序)for (String hero : heros) {System.out.println("hero = " + hero);}jedis.close();}
}

注意: 可以使用 zrevrange() 方法/命令,是个降序(根据 score评分值进行降序)

java">Set<String> heros = jedis.zrevrange("heros", 0, -1);  // 降序(根据 score 评分值降序)

在这里插入图片描述

java">
import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;public class JedisTest {// zset 有序集合操作@Testpublic void zset() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");jedis.zadd("heros", 1, "关羽");jedis.zadd("heros", 2, "张飞");jedis.zadd("heros", 3, "赵云");jedis.zadd("heros", 4, "马超");jedis.zadd("heros", 5, "黄忠");// 取出//Set<String> heros = jedis.zrange("heros", 0, -1);  // 默认是升序(根据 score 评分值升序)Set<String> heros = jedis.zrevrange("heros", 0, -1);  // 降序(根据 score 评分值降序)for (String hero : heros) {System.out.println("hero = " + hero);}jedis.close();}
}

3. 最后:

感谢网友的总结:https://blog.csdn.net/CYY941027/article/details/109110455

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述


http://www.ppmy.cn/devtools/155938.html

相关文章

51单片机 04 编程

一、模块化编程 .c文件&#xff1a;函数、变量的定义 .h文件&#xff1a;可被外部调用的函数、变量的声明 函数在调用前必须有定义或者声明。 预编译&#xff1a;以#开头&#xff0c;作用是在真正的编译开始之前&#xff0c;对代码做一些处理&#xff08;预编译&#xff09…

DeepSeek R1本地化部署 Ollama + Chatbox 打造最强 AI 工具

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; Ollama &#x1f98b; 下载 Ollama&#x1f98b; 选择模型&#x1f98b; 运行模型&#x1f98b; 使用 && 测试 二&#xff1a;&#x1f525; Chat…

【Elasticsearch】 Intervals Query

Elasticsearch Intervals Query 返回基于匹配术语的顺序和接近度的文档。 intervals 查询使用 匹配规则&#xff0c;这些规则由一小组定义构建而成。这些规则然后应用于指定 field 中的术语。 这些定义生成覆盖文本中术语的最小间隔序列。这些间隔可以进一步由父源组合和过滤…

DeepSeek对通达信编写的股票指标深度理解

今天试着把自己的一个“1(3)X模式”的通达信炒股指标喂给DeepSeek看它是否能理解这个指标模式的意图。 市值约束:= FINANCE(40)/100000000>20 AND FINANCE(40)/100000000<500;去ST:=NAMELIKE(ST)=0 AND NAMELIKE(*ST)=0 AND NAMELIKE(SST)=0; 去停牌:=DYNAINFO(8)>0; …

(二)QT——按钮小程序

目录 前言 按钮小程序 1、步骤 2、代码示例 3、多个按钮 ①信号与槽的一对一 ②多对一&#xff08;多个信号连接到同一个槽&#xff09; ③一对多&#xff08;一个信号连接到多个槽&#xff09; 结论 前言 按钮小程序 Qt 按钮程序通常包含 三个核心文件&#xff1a; m…

ICANN 关闭 WHOIS Port 43

2025年1月28日&#xff0c;ICANN&#xff08;互联网名称与数字地址分配机构&#xff09;将正式终止WHOIS Port 43服务。这一决定标志着网络安全行业、域名注册机构以及依赖域名数据进行运营或调查的所有人迎来重要变革。那么&#xff0c;这一变化意味着什么&#xff1f;它将如何…

解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路

前瞻 PosterBandit 这个脚本能够根据用户指定的日期&#xff0c;爬取你看过的影视最高清的海报&#xff0c;然后使用 PixelWeaver.py 自动拼接成指定大小的长图。 你是否发现直接从豆瓣爬取下来的海报清晰度很低&#xff1f; 使用 .pic .nbg img CSS 选择器&#xff0c;在 我…

[EAI-023] FAST,机器人动作专用的Tokenizer,提高VLA模型的能力和训练效率

Paper Card 论文标题&#xff1a;FAST: Efficient Action Tokenization for Vision-Language-Action Models 论文作者&#xff1a;Karl Pertsch, Kyle Stachowicz, Brian Ichter, Danny Driess, Suraj Nair, Quan Vuong, Oier Mees, Chelsea Finn, Sergey Levine 论文链接&…