
🚀 欢迎来到我的CSDN博客:Optimistic _ chen
✨ 一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!
🚀我的专栏推荐:
| 专栏 | 内容特色 | 适合人群 |
|---|---|---|
| 🔥C语言从入门到精通 | 系统讲解基础语法、指针、内存管理、项目实战 | 零基础新手、考研党、复习 |
| 🔥Java基础语法 | 系统解释了基础语法、类与对象、继承 | Java初学者 |
| 🔥Java核心技术 | 面向对象、集合框架、多线程、网络编程、新特性解析 | 有一定语法基础的开发者 |
| 🔥Java EE 进阶实战 | Servlet、JSP、SpringBoot、MyBatis、项目案例拆解 | 想快速入门Java Web开发的同学 |
| 🔥Java数据结构与算法 | 图解数据结构、LeetCode刷题解析、大厂面试算法题 | 面试备战、算法爱好者、计算机专业学生 |
| 🔥Redis系列 | 从数据类型到核心特性解析 | 项目必备 |
🚀我的承诺:
✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例
✅ 持续更新:专栏内容定期更新,紧跟技术趋势
✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)
🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨
📌 标签:#技术博客 #编程学习 #Java #C语言 #算法 #程序员
文章目录
- 前言
- Jedis
- 连接redis服务器
- Java操作命令
-
- 通用命令
- string类型命令
-
- append
- [incrby 和 decrby](#incrby 和 decrby)
- list类型命令
- Hash类型
-
- [hkeys 和 hvals](#hkeys 和 hvals)
- set命令
-
- [srem 和 sismember](#srem 和 sismember)
- sdiff
- ZSet类型
-
- [zcard 和 zscore](#zcard 和 zscore)
- zinterstore
- 完结撒花!🎉
前言
【Redis系列】常用数据结构---String
【Redis系列】常用数据结构---Hash类型
【Redis系列】常用数据结构---List类型
【Redis系列】常用数据结构---SET类型
【Redis系列】常用数据结构---ZSET类型
前面的学习主要是各种redis的基本操作/命令 ,都是在redis命令行客户端手动执行的,这种方式对于日常开发来说很难上手使用,所以更多时候,程序员们都使用redis的api,使用定制化的redis客户端程序 ,进一步操作redis服务器**(这种操作类似使用MyBatis操作数据库)**,用程序来操作redis服务器。
Jedis
因为redis官方公布了redis服务器使用的协议:RESP。所以任何人都可以通过这个协议来实现一个和redis服务器通信的客户端程序。我们可以将各大佬做好的客户端库直接调用(反正我实现不了)。Java体系中封装了RESP协议,有很多大佬实现了redis客户端的库,今天我们使用jedis库,通过maven引入。
现在我们的redis客户端就在我们的idea 上,而redis服务器却在我的云服务器 上,两者之间的通信必须经过外网IP来访问到我的服务器,才能到达redis服务器。

这种情况,
- 要么我把程序打一个jar包,把jar包拷贝到Linux服务器上去执行;
- 要么配置ssh端口转发,把云服务器的redis通信端口,映射到本地主机。

很明显,选择第二种方法会更加方便,否则redis每次进行通信都要对程序进行打包。
ssh端口转发
那么问题来了,SSH是怎么进行端口转发的?
SSH(Secure Shell) 是一种网络协议,用于在不安全的网络(如互联网)上提供安全的远程登录和安全的网络服务。
我们的XShell中就有这种协议,XShell远程登录到云服务器,通过SSH协议完成本地端口转发,将远程服务的端口映射到本地。

ssh默认走22端口,整个过程就是在本地构造 一个ssh数据报,把对redis的通信放到ssh数据报中 ,整个数据报通过ssh的22端口发送给云服务器 ,云服务器解析数据报,然后把数据交给redis6379端口,完成整个通信过程。
后续Java代码中,通过127.0.0.1:8888就能操作到云服务器中的redis了。
注意:除了配置ssh端口映射之外,还要修改redis服务器的配置,修改绑定的ip( 默认只能本机访问,不能跨主机访问);以及关闭保护模式(默认是yes,不能跨主机访问)
连接redis服务器
创建maven项目,引入jedis的依赖到pom.xml中
powershell
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.3.2</version>
</dependency>
- 使⽤JedisPool描述Redis服务器的位置.使⽤url来表⽰
- 使用
getResource和服务器建立连接
powershell
//连接到redis服务器上
JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");
try(Jedis jedis=jedisPool.getResource()){
String pong=jedis.ping();
System.out.println(pong);
}
- 连接使用完后要close关闭,也可以使用try自动关闭
- 通过ping检测连接是否建立

getResource() 就像去图书馆借书,不是买新书(创建连接),而是从书库(jedisPool连接池)里借一本已有的书,用完要还(close()),这样别人才能继续借。
Java操作命令
在程序中调用方法,其实和我们在命令行客户端中是一样的,只是把命令变为被调用的方法。因为之前我们系统写过基本的命令, 这里只简单展示一下即可。
通用命令
set和get
java
public static void test1(Jedis jedis){
System.out.println("get和set的使用");
//先情况数据库,避免上一组数据影响下一组测试
jedis.flushAll();
jedis.set("key1","111");
jedis.set("key2","222");
String value1=jedis.get("key1");
System.out.println("value"+value1);
String value2=jedis.get("key2");
System.out.println("value"+value2);
}
public static void main(String[] args) {
//连接到redis服务器上
JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");
try(Jedis jedis=jedisPool.getResource()){
String pong=jedis.ping();
System.out.println(pong);
test1(jedis);
test2(jedis);
}
}

exists和del
- exists 命令来检查给定的键是否存在。该命令会返回一个整数,表示键是否存在:1 表示存在,0 表示不存在
- del可以删除多个key,以变长参数列表的方式体现,返回值是实际删除的key的个数
powershell
private static void test2(Jedis jedis) {
jedis.set("key1","111");
jedis.set("key2","222");
jedis.set("key3","333");
//检测key1是否存在
boolean ret=jedis.exists("key1");
System.out.println(ret);
//删除key1
long n=jedis.del("key1");
System.out.println(n);
//检测key1是否存在
ret=jedis.exists("key1");
System.out.println(ret);
//批量删除
n=jedis.del("key3","key2");
System.out.println(n);
}

string类型命令
append
append:字符串追加
powershell
private static void test3(Jedis jedis) {
jedis.append("key2","hello ");
String value=jedis.get("key2");
System.out.println(value);
jedis.append("key2","redis String");
value=jedis.get("key2");
System.out.println(value);
}

incrby 和 decrby
- incrby对key的数值增加指定数量。如果不存在该键,则在执行递增前将其初始化为0。该命令是原子命令,仅对数值有效。
- decrby对密钥的数值减少指定数量。如果不存在该键,则在执行递减前将其初始化为0。该命令是原子命令,仅对数值有效。
powershell
private static void test4(Jedis jedis) {
jedis.set("key","0");
jedis.incrBy("key",5);//+5
System.out.println(jedis.get("key"));
jedis.decrBy("key",3);//-3
System.out.println(jedis.get("key"));
}

list类型命令
lrange
- lrange获取指定区间元素
powershell
private static void test5(Jedis jedis) {
jedis.rpush("list","1","2","3","4");
List<String> values=jedis.lrange("list",1,3);
System.out.println(values);
}

linsert
- 通过
ListPosition.BEFORE和ListPosition.AFTER标识插⼊位置.
powershell
private static void test6(Jedis jedis) {
jedis.rpush("list2","a","b","c","e");
jedis.linsert("list2", ListPosition.BEFORE,"e","d");
List<String> values=jedis.lrange("list2",0,-1);
System.out.println(values);
}

Hash类型
hkeys 和 hvals
- hkeys返回哈希表中所有键的列表。返回列表中字段的顺序无法保证
- hvals返回哈希表中所有值的列表。返回列表中值的顺序与 HKEYS 返回的字段顺序相对应
powershell
private static void test7(Jedis jedis) {
jedis.hset("hash1","name","zhangsan");
jedis.hset("hash1","age","20");
Set<String> keys=jedis.hkeys("hash1");
System.out.println(keys);
List<String> values=jedis.hvals("hash1");
System.out.println(values);
}

set命令
srem 和 sismember
- srem:删除集合中的指定元素,如果删除成功返回1,如果不存在则什么都不做返回0;如果指定的键不是集合类型则会报错。
- sismember:查看一个元素是否在集合中,如果在集合中返回1,如果不在集合中,或者指定集合的键不存在则返回0;如果指定的键存在但是不是集合类型则会报错。
powershell
private static void test8(Jedis jedis) {
jedis.sadd("set1","aaa","bbb","ccc");
boolean ret=jedis.sismember("set1","bbb");
System.out.println(ret);
long n= jedis.srem("set1","aaa","bbb");
System.out.println(n);
ret=jedis.sismember("set1","aaa");
System.out.println(ret);
ret=jedis.sismember("key1","111");
System.out.println(ret);
}


sdiff
- sdiff求差集,返回结果列表
powershell
private static void test9(Jedis jedis) {
jedis.sadd("set2","aaa","bbb","ccc","ddd");
jedis.sadd("set3","aaa","eee","ccc","fff");
Set<String> ret=jedis.sdiff("set2","set3");
System.out.println(ret);
}

ZSet类型
zcard 和 zscore
- zcard返回 key 的成员个数。 key不存在时,返回0
- zscore返回指定 key 和 member 的 分数值
powershell
private static void test10(Jedis jedis) {
jedis.zadd("zset",100,"张三");
jedis.zadd("zset",99,"李四");
jedis.zadd("zset",94,"赵六");
jedis.zadd("zset",96,"王五");
jedis.zadd("zset",80,"小王");
jedis.zadd("zset",85,"小赵");
long n=jedis.zcard("zset");
System.out.println(n);
double score=jedis.zscore("zset","小王");
System.out.println(score);
}

zinterstore
- zinterstore计算多个有序集合的交集,并将结果存储在新的有序集合中
powershell
private static void test11(Jedis jedis) {
jedis.zadd("zset1",100,"张三");
jedis.zadd("zset1",99,"李四");
jedis.zadd("zset1",85,"小赵");
jedis.zadd("zset2",100,"张三");
jedis.zadd("zset2",99,"李四");
jedis.zadd("zset2",94,"赵六");
jedis.zadd("zset2",96,"王五");
jedis.zadd("zset2",80,"小王");
jedis.zadd("zset2",85,"小赵");
long n=jedis.zinterstore("zset3","zset1","zset2");
System.out.println(n);
//Tuple元组是一种数据结构,可以容纳固定数量的元素,每个元素可能类型不同
List<Tuple> tuples=jedis.zrangeWithScores("zset3",0,-1);
System.out.println(tuples);
}

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~
✨ 想获取更多干货? 欢迎关注我的专栏 → optimistic_chen
📌 收藏本文,下次需要时不迷路!
我们下期再见!💫 持续更新中......
悄悄说:点击主页有更多精彩内容哦~ 😊
