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