Java 使用 Jedis 操作 Redis
Jedis 的 API 方法跟 Redis 的命令基本上完全一致,熟悉 Redis 的操作命令,自然就很容易使用 Jedis,因此官方也推荐 Java 使用 Jedis 来连接和操作 Redis 。由于我的电脑重装了系统,暂时没有安装虚拟机来运行 Linux 环境,因此临时采用 Windows 版本的 Redis 快速搭建环境。
本篇博客主要展示如何快速的使用 Jedis 连接和操作 Redis,在博客的最后面提供 demo 的源代码。
Jedis 的官网地址:https://github.com/redis/jedis
一、快速搭建 Redis 环境
Windows 版本的 Redis 的官网:https://github.com/microsoftarchive/redis
其实就是微软提供的 Redis 版本,目前最新版是 3.2.100,下载这个版本即可,下载地址为:
https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100
下载 Redis-x64-3.2.100.zip
这个文件,解压缩即可,运行 redis-server.exe 即可。
默认情况下 Redis 没有设置密码,可以通过 redis.windows.conf 这个配置文件进行配置,有关 Redis 配置文件的细节,这里不做介绍,网上资料一大堆。
这里就以本机无密码的 Redis 快速搭建一个环境来介绍 Jedis 的使用。如果你想感觉每次手动启动 Redis 比较麻烦的话,可以将 Redis 安装成 Windows 服务,打开 cmd 命令行窗口,进入 Redis 的目录,运行以下命令安装 Redis 服务:
redis-server.exe --service-install redis.windows-service.conf
然后进入服务管理器,启动 Redis 服务即可,如下图所示:
进入 Redis 的目录后可以运行下面的命令,也许对你有用:
# 卸载服务: redis-server --service-uninstall # 启动服务: redis-server --service-start # 停止服务: redis-server --service-stop # 重命名服务名称: redis-server --service-name name
二、搭建工程
新建一个 maven 工程,并导入 Jedis 的 jar 包。
Jedis 的 jar 包地址为:https://mvnrepository.com/artifact/redis.clients/jedis
我导入的是最新的 Jedis 的 jar 包,另外为了方便测试,也导入了最新的 juint 的 jar 包,具体内容如下:
<!-- 导入 jedis 的 jar 包 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.1.1</version> </dependency> <!-- 导入 junit 的 jar 包 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency>
配置好引用的 jar 包后,打开右侧的 Maven 窗口,刷新一下,这样 Maven 会自动下载所需的 jar 包文件。
搭建好的项目工程整体目录比较简单,具体如下图所示:
项目工程结构简单介绍:
com.jobs.utils.jedisUtils 自己编写的使用 Jedis 访问 Redis 的工具类
resources 下的 redis.properties 是用来自定义 Jedis 连接池参数的配置文件
test 目录下的文件介绍:
com.jobs.JedisTest 类是专门用来编写 junit 单元测试方法,用来测试操作 Redis 的方法
三、细节展示
resources 下的 redis.properties 配置文件内容如下:
# 最大连接数 maxTotal=50 # 最大空闲连接数 maxIdel=10 # redis 服务器地址 host=localhost # redis 服务器端口 port=6379
com.jobs.utils.jedisUtils 使用 Jedis 连接池编写的工具类内容如下:
package com.jobs.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import java.util.ResourceBundle; public class jedisUtils { // 定义 Jedis 连接池 private static JedisPool jp; static { /* // 第一种获取 properties 配置文件内容的方式 InputStream is = jedisUtils.class .getClassLoader().getResourceAsStream("redis.properties"); Properties prop = new Properties(); try { prop.load(is); } catch (IOException e) { e.printStackTrace(); } int maxTotal = Integer.parseInt(prop.getProperty("maxTotal")); int maxIdel = Integer.parseInt(prop.getProperty("maxIdel")); String host = prop.getProperty("host"); int port = Integer.parseInt(prop.getProperty("port")); */ // 第二种获取 properties 配置文件内容的方式 ResourceBundle bundle = ResourceBundle.getBundle("redis"); int maxTotal = Integer.parseInt(bundle.getString("maxTotal")); int maxIdel = Integer.parseInt(bundle.getString("maxIdel")); String host = bundle.getString("host"); int port = Integer.parseInt(bundle.getString("port")); // 配置 Jedis 连接池 JedisPoolConfig jpc = new JedisPoolConfig(); jpc.setMaxTotal(maxTotal); jpc.setMaxIdle(maxIdel); jp = new JedisPool(jpc, host, port); // 如果 redis 有密码的话,使用这个初始化连接池(连接超时时间为 2000 毫秒) //jp = new JedisPool(jpc, host, port, 2000, "password"); // 如果 redis 有密码的话,并且想直接连接到 redis 的某个库的话,使用该方法 //jp = new JedisPool(jpc, host, port, 2000, "password",0); } // 从连接池中获取 Jedis 连接对象 public static Jedis getJedis() { return jp.getResource(); } }
com.jobs.JedisTest 类是专门用来测试操作 Redis 的方法类,具体内容如下:
package com.jobs; import com.jobs.utils.jedisUtils; 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 { // 测试字符串 String 数据类型 @Test public void testString() { Jedis jedis = jedisUtils.getJedis(); // 设置 jedis.set("name", "候胖胖"); jedis.set("age", "40"); // 获取 String name = jedis.get("name"); String age = jedis.get("age"); System.out.println("name:" + name + ",age:" + age); jedis.close(); } // 测试列表 List 数据类型 @Test public void testList() { Jedis jedis = jedisUtils.getJedis(); //redis 的 list 可以作为队列使用 // 从列表右边添加数据 jedis.rpush("fat", "任肥肥"); jedis.rpush("fat", "侯胖胖"); jedis.rpush("fat", "李墩墩"); // 获取列表的容量大小 long fatCount = jedis.llen("fat"); System.out.println("列表数量:" + fatCount); // 从左侧逐个取数据 for (int i = 0; i < fatCount; i++) { String fatMan = jedis.lpop("fat"); System.out.println(fatMan); } jedis.close(); } // 测试散列 Hash 数据类型 @Test public void testHash() { Jedis jedis = jedisUtils.getJedis(); //redis 的 hash 比较适合存储对象数据 Map<String, String> user1 = new HashMap<>(); user1.put("name", "侯胖胖"); user1.put("age", "40"); user1.put("kg", "80"); Map<String, String> user2 = new HashMap<>(); user2.put("name", "任肥肥"); user2.put("age", "38"); user2.put("kg", "90"); jedis.hmset("user1", user1); jedis.hmset("user2", user2); // 修改第一个用户的年龄 jedis.hset("user1", "age", "45"); // 修改第二个用户的体重 jedis.hset("user2", "kg", "100"); // 获取两个对象的属性值 Map<String, String> user111 = jedis.hgetAll("user1"); Map<String, String> user222 = jedis.hgetAll("user2"); System.out.println(user111); System.out.println(user222); jedis.close(); } // 测试集合 Set 数据类型 @Test public void testSet() { Jedis jedis = jedisUtils.getJedis(); //redis 的 set 跟 java 的 set 使用方式一样,重复的元素只保留一个 jedis.sadd("aaa", "a", "b", "c", "x", "y", "z", "a", "x"); jedis.sadd("bbb", "b", "c", "d", "e", "f", "y", "b", "e"); // 获取交集 Set<String> sinter = jedis.sinter("aaa", "bbb"); System.out.println("交集:" + sinter); // 获取并集 Set<String> sunion = jedis.sunion("aaa", "bbb"); System.out.println("并集:" + sunion); // 获取 aaa 相对于 bbb 的差集(存在于 aaa 但不存在与 bbb 的元素) Set<String> sdiff = jedis.sdiff("aaa", "bbb"); System.out.println("aaa 相对于 bbb 的差集:" + sdiff); jedis.close(); } // 测试有序集合 Sorted Set (ZSet) 数据类型 @Test public void testZset() { Jedis jedis = jedisUtils.getJedis(); //redis 的 zSet 比较适合做排行榜 // 粉丝投票 Map<String, Double> fans = new HashMap<>(); fans.put("侯胖胖", 10d); fans.put("李墩墩", 7d); fans.put("任肥肥", 6d); fans.put("乔豆豆", 12d); fans.put("杨重重", 8d); jedis.zadd("vote", fans); // 修改任肥肥的投票数 jedis.zadd("vote", 9d, "任肥肥"); //zSet 默认是按照分值的升序排列 List<String> vote1 = jedis.zrange("vote", 0, -1); System.out.println("投票数量升序排列:" + vote1); // 获取粉丝投票数量最多的前三个人 List<String> vote2 = jedis.zrevrange("vote", 0, 2); System.out.println("投票数量倒序前 3 个人:" + vote2); jedis.close(); } }
到此为止,已经快速的演示了 Java 使用 Jedis 连接操作 Redis 常用的 5 种数据类型的示例。Jedis 提供的方法 API 基本上跟 Redis 的命令完全一致,有关 Redis 的命令使用细节,可以参考 Redis 的官网(https://redis.io)。
本篇博客的 demo 源代码地址:https://files.cnblogs.com/files/blogs/699532/RedisDemo.zip