六. Redis当中的“发布” 和 “订阅” 的具体解说说明(图文并茂) ...

打印 上一主题 下一主题

主题 859|帖子 859|积分 2579

七. 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 依赖。
  1. <dependencies>
  2.         
  3.         <dependency>
  4.             <groupId>redis.clients</groupId>
  5.             <artifactId>jedis</artifactId>
  6.             <version>3.2.0</version>
  7.         </dependency>
  8.     </dependencies>
复制代码
Java 程序通过 Jedis 连接数据库之前,需要先将 Linux 当中安装的 Redis 服务器启动起来。
  1. [root@localhost bin]# redis-server /etc/redis.conf # 启动 redis 服务器
  2. [root@localhost bin]# redis-cli # 进入到 Redis 客户端
复制代码



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

  1. package com.rainbowsea.jedis;
  2. import org.junit.Test;
  3. import redis.clients.jedis.Jedis;
  4. public class JedisTest {
  5.     // 连接 Redis
  6.     @Test
  7.     public void con() {
  8.         // 使用 ip地址 + redis的端口的构造器方法
  9.         Jedis jedis = new Jedis("192.168.76.145", 6379);
  10.         String ping = jedis.ping();
  11.         System.out.println("连接成功 ping 返回的结果 = " + ping);
  12.         jedis.close();  // 关闭连接
  13.     }
  14. }
复制代码
ip地址没错,我们是复制过来的。端口号也没错,是默认的6379 。可表现连接不上。同时还提示我们连接超时了。

原因和解决方法:

  • 第一个原因是:我们 Linux 当中的对于 6379 这个端口的防火墙是关闭的。如果防火墙是对于该 6379 端口是关闭,不是开放的。我们外界是无法连接上该端口的。所以我们需要在 Linux 当中将该 6379 端口打开开启。让我们外界(Java 程序)可以连接该 6379端口。
具体操作如下:
  1. [root@localhost bin]# firewall-cmd --list-all
复制代码

设置开放的端口号:
  1. [root@localhost bin]# firewall-cmd --add-port=6379/tcp --permanent
复制代码

注意:设置后开放端口以后,还得重启一下防火墙才能生效。
重启防火墙:
  1. [root@localhost bin]# firewall-cmd --reload # 重启防火墙
复制代码

再次实行 firewall-cmd --list-all 命令查看是否,将 6379 端口打开成功。
  1. [root@localhost bin]# firewall-cmd --list-all
复制代码


  • 第二个原因:在Redis 当中的 /etc/redis.conf 文件当中,存在一个 bind ,设置:我们需要将其设置为长途访问的设置。而不是本机设置。
使用 vim 打开该文件,举行修改。
  1. [root@localhost bin]# vim /etc/redis.conf
复制代码

  1. # bind 127.0.0.1 -::1
复制代码
同样修改了配置之后,需要关闭 Redis 服务,再启动 Redis 服务,配置才能生效。
  1. [root@localhost ~]# redis-cli -p 6379 shutdown # 关闭 Redis 服务
复制代码
  1. [root@localhost bin]# redis-server /etc/redis.conf # 重启Redis 服务器
复制代码


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

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


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

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


我们再次实行在Java程序当中连接 Redis 。
注意: 这里我们 Redis 设置了密码,所以我们Java程序连接的时候,需要先实行 auth() 方法举行一个认证登录,才能连接上 Redis 服务。不然是无法连接数上的。
  1. package com.rainbowsea.jedis;
  2. import org.junit.Test;
  3. import redis.clients.jedis.Jedis;
  4. public class JedisTest {
  5.     // 连接 Redis
  6.     // 1. 如果Redis 设置了密码,则需要进行身份校验
  7.     // 2. 因为需要连接到 redis端口,比如6379,就需要配置防火墙,放开端口
  8.     // 3. 注意修改 bind ,支持远程连接
  9.     // 4 注意关闭保护模式,protected-mode no ,no表示关闭
  10.     // 5. 注意:设置了密码,需要执行 auth(密码)进行身份验证
  11.     @Test
  12.     public void con() {
  13.         // 使用 ip地址 + redis的端口的构造器方法
  14.         Jedis jedis = new Jedis("192.168.76.145", 6379);
  15.         // 如果Redis 配置了密码,则需要进行身份校验
  16.         jedis.auth("rainbowsea");
  17.         String ping = jedis.ping();
  18.         System.out.println("连接成功 ping 返回的结果 = " + ping);
  19.         jedis.close();  // 关闭当前连接,注意并没有关闭 Redis
  20.     }
  21. }
复制代码
2.2 Java程序通过 Jedis当中操作 Redis 的 key 键值对

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

  1. import org.junit.Test;
  2. import redis.clients.jedis.Jedis;
  3. import java.util.Set;
  4. public class JedisTest {
  5.     // key 操作
  6.     @Test
  7.     public void key() {
  8.         // 创建 jedis 连接对象
  9.         Jedis jedis = new Jedis("192.168.76.145", 6379);
  10.         // 密码身份登录
  11.         jedis.auth("rainbowsea");
  12.         jedis.set("k1", "v1");
  13.         jedis.set("k2", "v2");
  14.         jedis.set("k3", "v3");
  15.         // 获取key
  16.         Set<String> keys = jedis.keys("*");
  17.         for (String key : keys) {
  18.             System.out.println("key=>" + key);
  19.         }
  20.         // 判断 key 是否存在
  21.         System.out.println("exists:" + jedis.exists("k1")); // True
  22.         System.out.println("exists: " + jedis.exists("k99"));
  23.         // ttl
  24.         System.out.println("ttl:" + jedis.ttl("k2"));
  25.         System.out.println("k3 = " + jedis.get("k3")); // v3
  26.         jedis.close();// 关闭当前连接
  27.     }
  28. }
复制代码
2.3  Java程序通过 Jedis 当中操作 Redis 的 string 字符串

  1. import org.junit.Test;
  2. import redis.clients.jedis.Jedis;
  3. import java.util.List;
  4. import java.util.Set;
  5. public class JedisTest {
  6.     // string 操作
  7.     @Test
  8.     public void string() {
  9.         // 创建 jedis 连接对象
  10.         Jedis jedis = new Jedis("192.168.76.145", 6379);
  11.         // 密码身份登录
  12.         jedis.auth("rainbowsea");
  13.         // 批量设置k-v
  14.         jedis.mset("s1","jack","s2","scott","s3","rainbow");
  15.         // 批量获取
  16.         List<String> mget = jedis.mget("s1", "s2");
  17.         for (String s : mget) {
  18.             System.out.println("s -> " + s);
  19.         }
  20.         jedis.close();
  21.     }
  22. }
复制代码
2.4 Java程序通过 Jedis 当中操作 Redis 的 list 列表

  1. import org.junit.Test;
  2. import redis.clients.jedis.Jedis;
  3. import java.util.List;
  4. import java.util.Set;
  5. public class JedisTest {
  6.     // list 操作
  7.     @Test
  8.     public void list() {
  9.         // 创建 jedis 连接对象
  10.         Jedis jedis = new Jedis("192.168.76.145", 6379);
  11.         // 密码身份登录
  12.         jedis.auth("rainbowsea");
  13.         // 添加 list 数据
  14.         jedis.lpush("name_list", "jack", "tom", "nono");
  15.         List<String> nameList = jedis.lrange("name_list", 0, -1);
  16.         for (String name : nameList) {
  17.             System.out.println("name -->" + name);
  18.         }
  19.         jedis.close();
  20.     }
  21. }
复制代码
2.5 Java程序通过 Jedis 当中操作 Redis 的 set 聚集

  1. import org.junit.Test;
  2. import redis.clients.jedis.Jedis;
  3. import java.util.List;
  4. import java.util.Set;
  5. public class JedisTest {
  6.     // set 操作
  7.     @Test
  8.     public void set() {
  9.         // 创建 jedis 连接对象
  10.         Jedis jedis = new Jedis("192.168.76.145", 6379);
  11.         // 密码身份登录
  12.         jedis.auth("rainbowsea");
  13.         jedis.sadd("city","北京","上海");
  14.         jedis.sadd("city","广州");
  15.         jedis.sadd("city","深圳");
  16.         Set<String> smembers = jedis.smembers("city");
  17.         for (String city : smembers) {
  18.             System.out.println("city -->" + city);
  19.         }
  20.         jedis.close(); // 关闭连接
  21.     }
  22. }
复制代码
2.6 Java程序通过 Jedis 当中操作 Redis 的 hash 哈希表

  1. import org.junit.Test;
  2. import redis.clients.jedis.Jedis;
  3. import java.util.List;
  4. import java.util.Set;
  5. public class JedisTest {
  6.     // hash操作
  7.     @Test
  8.     public void hash() {
  9.         // 创建 jedis 连接对象
  10.         Jedis jedis = new Jedis("192.168.76.145", 6379);
  11.         // 密码身份登录
  12.         jedis.auth("rainbowsea");
  13.         jedis.hset("hash01", "name", "李白");
  14.         jedis.hset("hash01", "age", "18");
  15.         // 获取hash 的值
  16.         String name = jedis.hget("hash01", "name");
  17.         System.out.println("name - >" + name);
  18.         jedis.close();
  19.     }
  20. }
复制代码
也可以先构建一个 Java的 map,然后再加入到 Redis 当中的 hash 值当中。
  1. import org.junit.Test;
  2. import redis.clients.jedis.Jedis;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Set;
  7. public class JedisTest {
  8.     // hash操作
  9.     @Test
  10.     public void hash2() {
  11.         // 创建 jedis 连接对象
  12.         Jedis jedis = new Jedis("192.168.76.145", 6379);
  13.         // 密码身份登录
  14.         jedis.auth("rainbowsea");
  15.         // 先构建一个Java的map
  16.         Map<String, String> maps = new HashMap<>();
  17.         maps.put("job", "Java工程师");
  18.         maps.put("name", "李华");
  19.         maps.put("emial", "lihua@qq.com");
  20.         jedis.hset("hash02", maps);
  21.         // 获取hash 的值
  22.         List<String> person = jedis.hmget("hash02", "name", "job", "emial");
  23.         for (String s : person) {
  24.             System.out.println("s = >" + s);
  25.         }
  26.         jedis.close();
  27.     }
  28. }
复制代码
2.7 Java程序通过 Jedis 当中操作 Redis 的 Zset 有序聚集

  1. import org.junit.Test;
  2. import redis.clients.jedis.Jedis;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Set;
  7. public class JedisTest {
  8.     // zset 有序集合操作
  9.     @Test
  10.     public void zset() {
  11.         // 创建 jedis 连接对象
  12.         Jedis jedis = new Jedis("192.168.76.145", 6379);
  13.         // 密码身份登录
  14.         jedis.auth("rainbowsea");
  15.         jedis.zadd("heros", 1, "关羽");
  16.         jedis.zadd("heros", 2, "张飞");
  17.         jedis.zadd("heros", 3, "赵云");
  18.         jedis.zadd("heros", 4, "马超");
  19.         jedis.zadd("heros", 5, "黄忠");
  20.         // 取出
  21.         Set<String> heros = jedis.zrange("heros", 0, -1);  // 默认是升序(根据 score 评分值升序)
  22.         for (String hero : heros) {
  23.             System.out.println("hero = " + hero);
  24.         }
  25.         jedis.close();
  26.     }
  27. }
复制代码
注意: 可以使用 zrevrange() 方法/命令,是个降序(根据 score评分值举行降序)
  1. Set<String> heros = jedis.zrevrange("heros", 0, -1);  // 降序(根据 score 评分值降序)
复制代码
  1. 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 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
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和复兴是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的范畴奋斗。感谢你们,我们总会在某个时刻再次相遇。”


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表