文章目錄
- 1 Redis的Java客戶端
- 1.1 Jedis快速入門
- 1.1.1 入門案例
- 1.1.1.1 項目構建
- 1.1.1.2 引入依賴
- 1.1.1.3 建立連接
- 1.1.1.4 釋放資源
- 1.1.1.5 測試
- 1.1.1.6 完整測試類代碼
- 1.1.2 Jedis連接池
- 1.1.2.1 連接池工具類
- 1.1.2.2 改造原始代碼
🙊 前言:本文章為瑞_系列專欄之《Redis》的基礎篇的Redis的Java客戶端章節。由于博主是從B站黑馬程序員的《Redis》學習其相關知識,所以本系列專欄主要是針對該課程進行筆記總結和拓展,文中的部分原理及圖解等也是來源于黑馬提供的資料,特此注明。本文僅供大家交流、學習及研究使用,禁止用于商業用途,違者必究!
主機操作系統:Windows10
VMware版本:?VMware Workstation 16.2.4
Linux版本:CentOS 7 64位
遠程連接工具:MobaXterm_Personal_23.2
Redis版本:redis-6.2.6.tar.gz
Redis客戶端:resp-2022.2.0.0
相關鏈接:《瑞_VMware虛擬機安裝Linux純凈版(含卸載,圖文超詳細)》
相關鏈接:《瑞_Redis_初識Redis(含安裝教程)》
相關鏈接:《瑞_Redis_Redis客戶端》
相關鏈接:《瑞_Redis_Redis命令》
1 Redis的Java客戶端
??在Redis官網中提供了各種語言的客戶端,地址:https://redis.io/docs/clients/
??標記為?的就是推薦使用的java客戶端,包括??
- Jedis和Lettuce:這兩個主要是提供了Redis命令對應的API,方便我們操作Redis,而SpringDataRedis又對這兩種做了抽象和封裝,因此我們后期會直接以SpringDataRedis來學習。
- Redisson:是在Redis基礎上實現了分布式的可伸縮的java數據結構,例如Map.Queue等,而且支持跨進程的同步機制:Lock.Semaphore等待,比較適合用來實現特殊的功能需求。
Spring Data Redis 底層兼容了 Jedis 和 Lettuce
1.1 Jedis快速入門
??Jedis的官網地址:http://github.com/redis/jedis
1.1.1 入門案例
1.1.1.1 項目構建
??新建一個普通的 Maven 項目,項目名為jedis-demo
,如下
1.1.1.2 引入依賴
??pom.xml 引入依賴如下:
<!--jedis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency><!--單元測試--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.7.0</version><scope>test</scope></dependency>
瑞:隨時時間的推移,該版本可能已經較為老舊(但適配JDK1.8)如果下載不到該依賴,可以參考下面的配置
??能下載到 jedis 3.7.0版本的鏡像倉庫的Maven配置
<mirror><id>nexus-aliyun</id><mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf><name>Nexus aliyun</name><url>https://maven.aliyun.com/repository/public</url></mirror>
1.1.1.3 建立連接
??新建一個單元測試類JedisTest
,內容如下:
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;import java.util.Map;/*** Jedis快速入門測試** @author LiaoYuXing-Ray* @version 1.0* @createDate 2024/3/1 21:59**/
public class JedisTest {private Jedis jedis;@BeforeEachvoid setUp() {// 1.建立連接(IP換成你Redis服務的IP)jedis = new Jedis("192.168.13.128", 6379);// 2.設置密碼(如果密碼不一樣請記得替換)jedis.auth("123456");// 3.選擇庫jedis.select(0);}
}
1.1.1.4 釋放資源
@AfterEach
void tearDown() {if (jedis != null) {jedis.close();}
}
瑞:釋放連接千萬不能忘,否則容易造成內存泄漏,內存泄漏的積累可能會導致內存溢出,后果非常嚴重
1.1.1.5 測試
@Test
void testString() {// 存入數據String result = jedis.set("name", "虎哥");System.out.println("result = " + result);// 獲取數據String name = jedis.get("name");System.out.println("name = " + name);
}@Test
void testHash() {// 插入hash數據jedis.hset("user:1", "name", "Jack");jedis.hset("user:1", "age", "21");// 獲取Map<String, String> map = jedis.hgetAll("user:1");System.out.println(map);
}
1.1.1.6 完整測試類代碼
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;import java.util.Map;/*** Jedis快速入門測試** @author LiaoYuXing-Ray* @version 1.0* @createDate 2024/3/1 21:59**/
public class JedisTest {private Jedis jedis;@BeforeEachvoid setUp() {// 1.建立連接(IP換成你Redis服務的IP)jedis = new Jedis("192.168.13.128", 6379);// 2.設置密碼(如果密碼不一樣請記得替換)jedis.auth("123456");// 3.選擇庫jedis.select(0);}@AfterEachvoid tearDown() {if (jedis != null) {jedis.close();}}@Testvoid testString() {// 存入數據String result = jedis.set("name", "瑞神");System.out.println("result = " + result);// 獲取數據String name = jedis.get("name");System.out.println("name = " + name);}@Testvoid testHash() {// 插入hash數據jedis.hset("user:1", "name", "Jack");jedis.hset("user:1", "age", "21");// 獲取Map<String, String> map = jedis.hgetAll("user:1");System.out.println(map);}
}
??運行結果如下??
瑞:
??如果連接不上Linux中的Redis服務,可以參考《附:解決Liunx防火墻和開放端口號》
??其它Redis數據類型的命令不演示,有需要可以參考《瑞_Redis_Redis命令》
1.1.2 Jedis連接池
??Jedis本身是線程不安全的,并且頻繁的創建和銷毀連接會有性能損耗,因此我們推薦大家使用Jedis連接池代替Jedis的直連方式。
??有關池化思想,并不僅僅是這里會使用,很多地方都有,比如說我們的數據庫連接池,比如我們 tomcat 中的線程池,這些都是池化思想的體現。
1.1.2.1 連接池工具類
瑞:以下代碼基于本文1.1.1章節的項目
??創建JedisConnectionFactory
連接池工具類
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;/*** Jedis 連接池工具類** @author LiaoYuXing-Ray* @version 1.0* @createDate 2024/3/1 22:32**/
public class JedisConnectionFactory {private static final JedisPool jedisPool;static {// 配置連接池JedisPoolConfig poolConfig = new JedisPoolConfig();// 最大連接poolConfig.setMaxTotal(8);// 最大空閑連接poolConfig.setMaxIdle(8);// 最小空閑連接poolConfig.setMinIdle(0);// 設置最長等待時間,單位:mspoolConfig.setMaxWaitMillis(1000);// 創建連接池對象(記得替換為你Redis服務的IP,端口,密碼)jedisPool = new JedisPool(poolConfig,"192.168.13.128",6379,1000,"123456");}// 獲取Jedis對象public static Jedis getJedis(){return jedisPool.getResource();}
}
代碼說明:
- 1) JedisConnectionFacotry:工廠設計模式是實際開發中非常常用的一種設計模式,我們可以使用工廠,去降低代的耦合,比如Spring中的Bean的創建,就用到了工廠設計模式
瑞:工廠模式詳情可以參考《瑞_23種設計模式_工廠模式》
- 2)靜態代碼塊:隨著類的加載而加載,確保只能執行一次,我們在加載當前工廠類的時候,就可以執行static的操作完成對連接池的初始化
- 3)最后提供返回連接池中連接的方法
1.1.2.2 改造原始代碼
??對JedisTest
類進行如下改造,測試方法不變
@BeforeEachvoid setUp() {// 1.建立連接(IP換成你Redis服務的IP)
// jedis = new Jedis("192.168.13.128", 6379);// 代碼改造jedis = JedisConnectionFactory.getJedis();// 2.設置密碼(如果密碼不一樣請記得替換)jedis.auth("123456");// 3.選擇庫jedis.select(0);}@AfterEachvoid tearDown() {if (jedis != null) {// 代碼未修改,但是執行邏輯變為向連接池歸還連接對象jedis.close();}}
??代碼說明:
??在我們完成了使用工廠設計模式來完成代碼的編寫之后,我們在獲得連接時,就可以通過工廠來獲得。而不用直接去new對象,降低耦合,并且使用的還是連接池對象。
??當我們使用了連接池后,我們關閉連接其實并不是關閉,而是將Jedis連接對象還回連接池
??如果覺得這篇文章對您有所幫助的話,請動動小手點波關注💗,你的點贊👍收藏??轉發🔗評論📝都是對博主最好的支持~