六. Redis当中的“发布” 和 “订阅” 的详细讲解说明(图文并茂)
七. Redis 当中 Jedis 的详细刨析与使用
@
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 的注意事项

package com.rainbowsea.jedis;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class JedisTest {
// 连接 Redis
@Test
public 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 。可显示连接不上。同时还提示我们连接超时了。
原因和解决方法:
- 第一个原因是:我们 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

- 第二个原因:在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 服务器

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

同样修改了配置之后,需要关闭 Redis 服务,再启动 Redis 服务,配置才能生效。
我们再次尝试在Java程序当中连接 Redis 。

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

同样修改了配置之后,需要关闭 Redis 服务,再启动 Redis 服务,配置才能生效。
设置密码后:使用 auth 密码 登录。


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

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(密码)进行身份验证
@Test
public 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


import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Set;
public class JedisTest {
// key 操作
@Test
public 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");
// 获取key
Set<String> keys = jedis.keys("*");
for (String key : keys) {
System.out.println("key=>" + key);
}
// 判断 key 是否存在
System.out.println("exists:" + jedis.exists("k1")); // True
System.out.println("exists: " + jedis.exists("k99"));
// ttl
System.out.println("ttl:" + jedis.ttl("k2"));
System.out.println("k3 = " + jedis.get("k3")); // v3
jedis.close();// 关闭当前连接
}
}
2.3 Java程序通过 Jedis 当中操作 Redis 的 string 字符串

import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.Set;
public class JedisTest {
// string 操作
@Test
public void string() {
// 创建 jedis 连接对象
Jedis jedis = new Jedis("192.168.76.145", 6379);
// 密码身份登录
jedis.auth("rainbowsea");
// 批量设置k-v
jedis.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 列表

import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.Set;
public class JedisTest {
// list 操作
@Test
public 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 集合

import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.Set;
public class JedisTest {
// set 操作
@Test
public 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 哈希表

import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.Set;
public class JedisTest {
// hash操作
@Test
public 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 值当中。

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操作
@Test
public void hash2() {
// 创建 jedis 连接对象
Jedis jedis = new Jedis("192.168.76.145", 6379);
// 密码身份登录
jedis.auth("rainbowsea");
// 先构建一个Java的map
Map<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 有序集合

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 有序集合操作
@Test
public 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评分值进行降序)Set<String> heros = jedis.zrevrange("heros", 0, -1); // 降序(根据 score 评分值降序)

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 有序集合操作
@Test
public 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
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
六. Redis当中的“发布” 和 “订阅” 的详细讲解说明(图文并茂)的更多相关文章
- Redis中的发布与订阅
redis中实现发布与订阅相对于zookeeper非常简单.直接使用publish和subscribe就行. subscrible news; 订阅news这个channel publish news ...
- Redis的消息发布和订阅
Redis的消息发布和订阅 Author:SimpleWu GitHub-redis 什么是消息发布和订阅? Redis 发布订阅(pub/sub)是一种进程间的消息通信模式: 发送者(pub)发送消 ...
- .NetCore使用Redis,StackExchange.Redis队列,发布与订阅,分布式锁的简单使用
环境:之前一直是使用serverStack.Redis的客服端,今天来使用一下StackExchange.Redis(个人感觉更加的人性化一些,也是免费的,性能也不会差太多),版本为StackExch ...
- redis 笔记06 发布与订阅、事务、慢查询日志、监视器
发布与订阅 1. 服务器状态在pubsub_channels字典保存了所有频道的订阅关系:SUBSCRIBE命令负责将客户端和被订阅的频道关联到这个字典里面,而UNSUBSCRIBE命令则负责 解除客 ...
- Redis消息之发布与订阅
"发布/订阅"可以实现进程间的消息传递 发布的消息不会持久化,只能收到订阅后的消息,执行subscribe命令后客户端会进入"订阅"状态,处于此状态下的客户端不 ...
- redis 事务 及发布于订阅功能
事务: Redis事务可以一次执行多个命令,事务具有以下特征: 1.隔离操作:事务中的所有命令都会序列化.按顺序地执行,不会被其他命令打扰. 2.原子操作:事务中的命令要么全部被执行,要么全部都不执行 ...
- redis 实现消息发布和订阅
1,打开二个客户端机器 一个用于发布,一个用于接受 2,发布一个channel1 3,用另外一个客户端收听上面的客户端 4,当再次在发布的redis客户端 发布一个消息 其他所有订阅的客户端会自动收 ...
- Redis 之消息发布与订阅(publish、subscribe)
使用办法: 订阅端: Subscribe 频道名称 发布端: publish 频道名称 发布内容 一般做群聊,聊天室,发布公告信息等.
- Redis消息的发布与订阅
- redis 发布和订阅实现
参考文献 15天玩转redis -- 第九篇 发布/订阅模式 <Redis设计与实现> 命令简介 在redis用户手册中,跟发布订阅相关的命令有如下的六个: PSUBSCRIBE PUBL ...
随机推荐
- 原生鸿蒙中的RN日志系统
一.创作背景 在上一篇博客中,我分享了在原生鸿蒙中,进行RN的热加载,以达到修改RN代码后不需要重新打包,即可实时调试的效果. 本次我将分享一下RN的日志系统,以及对js中线上bug的监听,希望能对大 ...
- Deque的应用案例-回文检查
7.Deque的应用案例-回文检查 回文检测:设计程序,检测一个字符串是否为回文. 回文:回文是一个字符串,读取首尾相同的字符,例如,radar toot madam. 分析:该问题的解决方案将使用 ...
- JDK中的动态代理
江苏 无锡 缪小东 写到代理模式这章,不得不提到JDK中的动态代理,它是java语言自身对动态代理的支持,类似于JDK中在java.util包中提供Observable类和Observer接口提供对观 ...
- PHP之JWT的token登录认证
1.JWT简介 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为 ...
- golang之基础语法
Go 是一种强类型语言. 这意味着你声明的每个变量都绑定到特定的数据类型,并且只接受与此类型匹配的值. Go 有四类数据类型: 基本类型:数字.字符串和布尔值 聚合类型:数组和结构 引用类型:指针.切 ...
- 简述GoLang优势与生态
开门见山,一睹golang的风采 性能优势 部署运维成本低 编码格式统一:测试简单 1. 性能优势 Go 语言被称为是:"21世纪的C语言",虽然这个帽子戴的有点高,不妨这里给大家 ...
- Celery之监控与管理
Celery两种监控工具: 命令行实用工具和Web实时监控工具Flower 一.命令行工具 1)进入shell环境 celery -A myCeleryProj.app shell Python 3. ...
- ContosoRetailDW数据库恢复问题
https://www.microsoft.com/en-us/download/details.aspx?id=18279 下载 ContosoBIdemoBAK.exe和ContosoBIdemo ...
- 使用mvn 将 pom文件推送到私服
1.业务场景 现在我有一个 *.pom文件 需要上传到私服. 比如 spring-cloud-dependencies-2021.0.9.pom 这个时候可以使用命令将这个文件传到私服. 2.上传脚本 ...
- 华为云云日志服务 HarmonyOS NEXT采集最佳实践
鸿蒙背景介绍 华为鸿蒙HarmonyOS系统是面向万物互联的全场景分布式操作系统,支持手机.平板.智能穿戴.智慧屏等多种终端设备运行,提供应用开发.设备开发的一站式服务的平台.2024 年 1 月 1 ...


