使用Java操作Redis的兩種方式Jedis、RedisTemplate

在這里插入圖片描述

??各位小伙伴們大家好,歡迎來到這個小扎扎的Redis 6專欄,在這個系列專欄中我對B站黑馬的Redis教程進行一個總結,鑒于 看到就是學到、學到就是賺到 精神,這波依然是血賺 ┗|`O′|┛

💡Redis知識點速覽

  • 🍖 Jedis的使用
    • 🥩 Jedis快速入門
    • 🥩 Jedis連接池
  • 🍖 SpringBoot整合RedisTemplate
    • 🥩 自定義配置RedisTemplate
    • 🥩 StringRedisTemplate

在這里插入圖片描述??我們知道,redis是一個很強大的NoSQL數據庫,從上面那一張圖就可以看出來它分別擁有支持多種語言的客戶端,Java語言就是其中之一。上面的截圖來源于官網:https://redis.io/docs/clients/在這里插入圖片描述??點開Java可以看到,官方推薦我們使用前三種Redisson、Jedis、Lettuce客戶端,那么他們分別有何優缺點,我們又該如何選擇呢?

  • Redisson是一個基于Redis實現的分布式、可伸縮的Java數據結構集合。包含了諸如Map、Queue、Lock、 Semaphore、AtomicLong等強大功能
  • Jedis以Redis命令作為方法名稱,學習成本低,簡單實用。但是Jedis實例是線程不安全的,多線程環境下必須需要使用連接池來連接
  • Lettuce是基于Netty實現的,支持同步、異步和響應式編程方式,并且是線程安全的。支持Redis的哨兵模式、集群模式和管道模式

??基于目前的使用狀況,我們先學習Jedis的原生API,然后再學習Spring整合Spring Data Redis框架,該框架底層很好的兼容了Jedis和Lettuce

🍖 Jedis的使用

🥩 Jedis快速入門

??官網地址: https://github.com/redis/jedis
第一步: 導依賴

<!--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>
</dependency>

第二步: 與redis建立連接,在Java中的體現就是實例化一個Jedis對象,構造器的參數需要虛擬機的ip地址,可以使用如下命令查看在這里插入圖片描述

/*** 與Redis建立連接 @BeforeEach表示每個方法執行之前都需要執行該方法* @Param void* @return*/
@BeforeEach
void setUp() {// 建立連接jedis = new Jedis("你的虛擬機ip", 6379);// 設置redis的密碼jedis.auth("你的redis密碼");// 選擇使用的庫 默認是0號庫jedis.select(0);
}

第三步: 測試各種添加查詢操作,API的名和redis的命令一致,其他操作參考redis的命令

/** * K-V的測試* @Param void * @return */
@Test
void testHash() {Map<String, String> map = new HashMap<String, String>();map.put("id", "1");map.put("username", "zhagnsan");map.put("age", "20");// 存入數據jedis.hset("user", map);// 獲取命令Set<String> userKeys = jedis.hkeys("user");List<String> userValues = jedis.hvals("user");// 輸出獲取的結果System.out.println(userKeys);System.out.println("============================");System.out.println(userValues);
}

第四步: 斷開連接

/*** 關閉連接  @AfterEach表示每個方法執行之后都需要執行該方法* @Param void* @return*/
@AfterEach
void tearDown() {if (jedis != null) {jedis.close();}
}
redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket.

??如果報上面的錯誤連接不上的話,可以參考這篇博客https://blog.csdn.net/qq_44624536/article/details/120213607,如果還是無法解決的話,很有可能就是虛擬機的防火墻沒有關閉,可以使用如下命令查看并關閉一下(我的就是這個錯誤原因)

# 查看防火墻狀態的命令
systemctl status firewalld
# 關閉防火墻的命令
systemctl stop firewalld

在這里插入圖片描述運行結果在這里插入圖片描述

🥩 Jedis連接池

??上面說過Jedis本身是線程不安全的,如果在多線程并發操作下極有可能出現線程安全問題,因此在并發的環境下,一定要為每一個線程創建一個獨立的線程對象。但是頻繁的創建銷毀連接會導致性能損耗,因此需要使用到Jedis連接池來代替Jedis的直接連接方式。
第一步: 使用工具類創建并配置連接池對象,并使用靜態方法返回連接

public class JedisConnectionFactory {private static final JedisPool JEDIS_POOL;static {// 配置連接池JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();// 設置最大連接數、最大空閑連接、最小空閑連接、設置無連接的等待時間(毫秒為單位)jedisPoolConfig.setMaxTotal(8);jedisPoolConfig.setMaxIdle(8);jedisPoolConfig.setMinIdle(0);jedisPoolConfig.setMaxWaitMillis(1000);// 創建連接池對象JEDIS_POOL = new JedisPool(jedisPoolConfig, "你的虛擬機ip", 6379, 1000, "你的redis密碼");}public static Jedis getJedis() {return JEDIS_POOL.getResource();}
}

第二步: 調用靜態方法建立連接即可,剩下的操作都一樣

@BeforeEach
void setUp() {// 建立連接jedis = JedisConnectionFactory.getJedis();// 選擇使用的庫 默認是0號庫jedis.select(0);
}

🍖 SpringBoot整合RedisTemplate

🥩 自定義配置RedisTemplate

第一步: 導入SpringBoot整合RedisTemplate的依賴,連接池的依賴,SpringBoot項目不用指定技術版本,繼承使用父工程中已經配置好的版本

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

第二步: 配置信息

spring:redis:host: 你的虛擬機ipport: 6379password: 你的redis密碼lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: 1000

第三步: 直接注入redisTemplate對象,使用它內部的API

@Autowired
private RedisTemplate redisTemplate;@Test
void contextLoads() {redisTemplate.opsForValue().set("name", "zhangsan");Object name = redisTemplate.opsForValue().get("name");System.out.println("name ==>" + name);
}

結果顯示并沒有問題,可以正常的存入讀出在這里插入圖片描述但是切換到redis中查看就有問題了,沒有name這個key,但是有一個亂碼的K-V生成,這是什么原因呢?是因為redisTemplate底層將這個K-V當做對象進行了默認的jdk序列化操作在這里插入圖片描述jdk序列化差生的結果會有很多的問題,結果可讀性很差,短字符串的話又會很占用內存空間,于是我們可以選擇使用其他的序列化方式,使用配置類替代默認的序列化配置

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {// 創建RedisTemple對象RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// 設置連接工廠redisTemplate.setConnectionFactory(redisConnectionFactory);// 創建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 設置K序列化redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());// 設置V序列化redisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);// 返回RedisTemplate對象return redisTemplate;}
}

由于使用到了JSON所以需要導入相關依賴,如果導入mvc的依賴的話會默認導入JSON但是,我們的項目沒有導MVC也沒有JSON,所以需要導一下

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>

在這里插入圖片描述
按理來說,value也可以是一個對象,redisTemplate會將其序列化為JSON對象進行存儲

 @Test
void test01() {redisTemplate.opsForValue().set("user", new User("zhangsan", 20));Object name = redisTemplate.opsForValue().get("name");System.out.println("user ==> " + name);
}

在這里插入圖片描述

🥩 StringRedisTemplate

??由于上面使用配置類自定義序列化的方式,導致序列化之后的字符串會帶",而且Jason對象序列化之后會帶有類的全限定名,數據量大了之后也會影響到存儲的性能。于是出現了StringRedisTemplate,這種模板很好的解決了上述問題,但是需要我們手動的將對象進行序列化和反序列化

@SpringBootTest
public class StringRedistemplateTest {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testvoid contextLoads() {stringRedisTemplate.opsForValue().set("name", "lisi");Object name = stringRedisTemplate.opsForValue().get("name");System.out.println("name ==>" + name);}// 創建ObjectMapper對象用于序列化和反序列化private static final ObjectMapper MAPPER = new ObjectMapper();@Testvoid test01() throws JsonProcessingException {// 創建user對象  并序列化對象User user = new User("zhangsan", 20);String userJson = MAPPER.writeValueAsString(user);// 寫數據stringRedisTemplate.opsForValue().set("user", userJson);// 讀數據并反序列化輸出String res = stringRedisTemplate.opsForValue().get("user");User jsonUser = MAPPER.readValue(res, User.class);System.out.println("user ==> " + jsonUser);}
}

在這里插入圖片描述

@Test
void testHash() {stringRedisTemplate.opsForHash().put("user01", "name", "lisi");stringRedisTemplate.opsForHash().put("user01", "age", "21");Map<Object, Object> user01 = stringRedisTemplate.opsForHash().entries("user01");System.out.println(user01);
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535026.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python提取數據庫數據_Python如何讀取MySQL數據庫表數據

本文實例為大家分享了Python讀取MySQL數據庫表數據的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下 環境&#xff1a;Python 3.6 ,Window 64bit 目的&#xff1a;從MySQL數據庫讀取目標表數據&#xff0c;并處理 代碼&#xff1a; # -*- coding: utf-8 -*- import p…

【項目實戰】基于Redis實現短信驗證碼登錄 (附源碼、思路)

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的Redis 6專欄&#xff0c;在這個系列專欄中我對B站黑馬的Redis教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知識點速覽&#…

加工中心刻字宏程序_FANUC OI系列圖書——車床、銑床及加工中心編程

? 這是金屬加工(mw1950pub)發布的第10035篇文章導讀今天跟大家分享FANUC OI系列圖書&#xff0c;包括車床、銑床及加工中心編程&#xff0c;快來看看吧&#xff01;《FANUC 0i數控車床/加工中心編程技巧與實例》選擇在企業里應用*廣泛、編程*具代表性的日本FANUCSeries0i-TC/T…

Redis 的緩存策略

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的Redis 6專欄&#xff0c;在這個系列專欄中我對B站黑馬的Redis教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知識點速覽&#…

python顯示數據長度_python – 獲取CSV的長度以顯示進度

我正在處理大量CSV文件,每個文件都包含大量行.我的目標是逐行獲取數據并使用 Python將其寫入數據庫.但是,由于存在大量數據,我希望能夠跟蹤已寫入的數據量.為此,我計算了排隊的文件數量,并在每次文件完成時繼續添加一個文件. 我想為CSV文件做類似的事情并顯示我在哪一行,以及總…

關閉后天 樹莓派_陪你一起玩樹莓派-系統安裝

從今天就開始我們的樹莓派之旅&#xff0c;心情是不是有點小激動&#xff1f;我們拿到一個樹莓派是一個裸機。我們要準備一張16G的高速TF閃存卡&#xff0c;一個5V/2A的USB電源和一根micro B的 usb線。裝機步驟&#xff1a;一、下載樹莓派系統1、瀏覽器打開樹莓派官方網站 http…

簡單的簽到代碼_PHP實現一個小小的簽到功能,到底用MySQL還是Redis?

來源 | http://suo.im/5EWN3k今天&#xff0c;看下簽到功能怎么選擇&#xff1f;現在的網站和app開發中&#xff0c;簽到是一個很常見的功能&#xff0c;如微博簽到送積分&#xff0c;簽到排行榜~微博簽到如移動app &#xff0c;簽到送流量等活動&#xff0c;移動app簽到用戶簽…

【Redis 6】緩存穿透、緩存雪崩、緩存擊穿(附解決方案、代碼)

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的Redis 6專欄&#xff0c;在這個系列專欄中我對B站黑馬的Redis教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知識點速覽&#…

8軟件遇到的問題及解決方法_Excel工作表中的8個常見問題,你一定遇到過,附解決方法...

在Excel工作表中&#xff0c;最常用的還是一些技巧&#xff0c;如果能夠熟練掌握&#xff0c;對于工作效率的提高絕對不是一點點哦&#xff0c;結合工作實際&#xff0c;小編對工作中常見的問題進行了總結&#xff0c;一共有8類&#xff0c;你一定也遇到過……一、Excel工作表常…

unity著色器和屏幕特效開發秘笈_Oculus研發分享:開發移動VR內容時應避免的PC渲染技術...

查看引用/信息源請點擊&#xff1a;映維網開發移動VR內容時應避免的PC渲染技術&#xff08;映維網 2019年11月25日&#xff09;有不少開發者都是以與PC相同的方式來開發Quest游戲&#xff0c;但這可能會導致優化性能方面出現大量困難。Oculus軟件工程師特雷弗達什&#xff08;T…

Java包裝類、java中的方法傳參機制:按值調用

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 方法…

尤克里里怎么樣_尤克里里和吉他區別?尤克里里與吉他相比有什么不可替代的優勢...

尤克里里和吉他有什么區別&#xff1f;想必大家都見過尤克里里吧&#xff0c;就是類似吉他形狀的一種小型弦撥樂器。我們可以簡單的認為&#xff1a;尤克里里是簡化版本的吉他&#xff0c;更加簡單&#xff0c;更加便宜。小編彈的就是尤克里里2.從外觀上&#xff1a;吉他很大&a…

餓漢懶漢單例設計模式的使用及區別、java中的import關鍵字

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 關于…

廣電運通不好進嗎_我可以說鄭州新風的安裝大部分都是垃圾嗎?

說鄭州的新風安裝都是垃圾&#xff0c;這話很無禮&#xff0c;很自大&#xff0c;很傲慢&#xff0c;但是我能說確實是這樣嘛&#xff1f;其實包括我以前安裝的也不合格——雖然我不是故意的。這幾年見過許多家同行安裝的新風&#xff0c;可以說目前見到的很多家都不合格&#…

Java迭代器和Collection接口

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 關于…

atlas安裝需要kafka嗎_Atlas 2.1.0 實踐(2)—— 安裝Atlas

在完成Atlas編譯以后&#xff0c;就可以進行Atlas的安裝了。Atlas的安裝主要是安裝Atlas的Server端&#xff0c;也就Atlas的管理頁面&#xff0c;并確保Atlas與Kafka Hbase Solr等組件的集成。Atlas的系統架構如下&#xff0c;在確保 底層在完成Atlas編譯以后&#xff0c;就可以…

ue4中隱藏燈光和相機圖標_[HDRP]物理燈光是什么?科普向

HDRP拋棄了Bulitin的燈光&#xff0c;改用物理單位以及物理屬性。那么物理燈光到底是什么&#xff1f;請點贊評論來支持作者&#xff0c;提前祝大家新年快樂。https://connect.unity.com/p/hdrp-wu-li-deng-guang-shi-shi-yao-ke-pu-xiang?connect.unity.com同步更新unity con…

私鑰經過哈希計算可以產生公鑰_「區塊鏈基礎概念100」:公鑰和私鑰 | 027

免責聲明&#xff1a;本文旨在傳遞更多市場信息&#xff0c;不構成任何投資建議。文章僅代表作者觀點&#xff0c;不代表火星財經官方立場。小編&#xff1a;記得關注哦投資區塊鏈&#xff0c;猛戳&#xff1a;火星財經App下載來源&#xff1a;學習區塊鏈原文標題&#xff1a;「…

關于List集合類ArrayList、LinkedList、Vector詳解

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 關于…

1562a檢測軟件_洛達1562a空間音頻版評測!!!

哈嘍大家好&#xff01;這里是小澤&#xff0c;一個不專業的Beatboxer~~~今天給大家帶來一期HQB最新空間音頻版洛達1562a耳機的評測視頻&#xff0c;建議先贊再看&#xff01;&#xff08;滑稽&#xff09;聽說你不點贊&#xff1f;昨晚拍了一晚&#xff0c;但是因為是第一次搞…