Redis在Java中的基本使用

本片將介紹 Redis 在 Java 中的基本使用


文章目錄

        • 1、使用jedis操作redis
          • 1.1、Jedis簡介
          • 1.2、引入jedis的Maven依賴
          • 1.2、獲取連接
          • 1.3、使用實例
        • 2、對于JedisPooled的使用
          • 2.1、使用JedisPooled
          • 2.2、關于連接池
        • 3、SpringBoot下使用Redis
          • 3.1、引入Maven依賴
          • 3.2、配置Redis連接
          • 3.3、創建RedisTemplate
        • 3.4、使用RedisTemplate


1、使用jedis操作redis

1.1、Jedis簡介

Jedis 是 Java 語言開發的 Redis 客戶端工具包,用于 Java 語言與 Redis 數據進行交互。

Jedis 在 github 官網地址:https://github.com/redis/jedis#readme

Jedis 只是對 Redis 命令的封裝,掌握 Redis 命令便可輕易上手 Jedis。

Jedis 遵循 RESP 協議規范開發,具有良好的通用性與可讀性。

1.2、引入jedis的Maven依賴
        <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.4.3</version></dependency>
1.2、獲取連接

對于許多應用程序,需要連接到 Redis 時。最好使用連接池。可以像這樣實例化一個 Jedis 連接池:

JedisPool pool = new JedisPool("localhost", 6379);

對于 JedisPool 實例,可以使用 try-With-resources 塊獲得連接并運行 Redis 命令(這種方式無須自己手動 close)。

try (Jedis jedis = pool.getResource()) {// 運行單個 SET 命令jedis.set("clientName", "Jedis");
}
1.3、使用實例

編寫以下代碼:

    public static void main(String[] args) {// Redis服務端IP和端口號JedisPool pool = new JedisPool("127.0.0.1", 6379);try (Jedis jedis = pool.getResource()) {// 使用相關Redis的命令// 選擇第0個數據庫進行操作jedis.select(0);// 向0號數據庫寫入,字符串數據jedis.set("Java", "best");jedis.set("PHP", "good");// 查詢是否寫入System.out.println(jedis.get("Java"));System.out.println(jedis.get("PHP"));}}

運行測試用例:

image-20230812233428661

Jedis 實例實現了大多數 Redis 命令,這些命令可以在 https://www.javadoc.io/doc/redis.clients/jedis/latest/redis/clients/jedis/Jedis.htmlApI 中查詢命令對應的方法。

image-20230812233859534


2、對于JedisPooled的使用

2.1、使用JedisPooled

對每個命令使用 try-with-resources 塊可能比較麻煩,因此我們可以考慮使用 JedisPooled。

JedisPooled jedis = new JedisPooled("localhost", 6379);

詳細代碼:

    public static void main(String[] args) {JedisPooled pool = new JedisPooled("127.0.0.1", 6379, null, null);pool.set("Java", "best");pool.set("PHP", "good");System.out.println(pool.get("Java"));System.out.println(pool.get("PHP"));}

運行效果:

image-20230812233428661

2.2、關于連接池

使用鏈接池是官方推薦的使用方式,通過連接池可以更好的使用 Jedis 的,我們可以通過 GenericObjectPoolConfig 對連接池進行相關配置,GenericObjectPoolConfig API 文檔:https://commons.apache.org/proper/commons-pool/apidocs/org/apache/commons/pool2/impl/GenericObjectPoolConfig.html

通過 GenericObjectPoolConfig 對象對連接池進行配置,具體代碼如下:

    public static void main(String[] args) {GenericObjectPoolConfig config = new JedisPoolConfig();// 設置連接池中最多允許放100個Jedis對象config.setMaxTotal(100);// 設置連接池中最大允許空閑連接config.setMaxIdle(100);// 設置連接池中最小允許的連接數config.setMinIdle(10);// 借出連接的時候是否測試有效性,推薦falseconfig.setTestOnBorrow(false);// 歸還時是否測試,推薦falseconfig.setTestOnReturn(false);// 創建時是否測試有效  開發的時候設置為false,實踐運行的時候設置為trueconfig.setTestOnCreate(false);// 當連接池內jedis無可用資源時,是否等待資源,trueconfig.setBlockWhenExhausted(true);// 沒有獲取資源時最長等待1秒,1秒后沒有還沒有的話就報錯config.setMaxWaitMillis(1000);JedisPool pool = new JedisPool(config, "127.0.0.1", 6379);try (Jedis jedis = pool.getResource()) {// 使用相關Redis的命令// 選擇第0個數據庫進行操作jedis.select(0);// 向0號數據庫寫入,字符串數據jedis.set("Java", "best");jedis.set("PHP", "good");// 查詢是否寫入System.out.println(jedis.get("Java"));System.out.println(jedis.get("PHP"));}}

運行效果:

image-20230812233428661


3、SpringBoot下使用Redis

3.1、引入Maven依賴

首先,需要在 pom.xml 文件中添加 Redis 依賴:

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

這個依賴包含了 Spring Data Redis,以及 Jedis 和 Lettuce 這兩種 Redis 客戶端的實現。

3.2、配置Redis連接

在 SpringBoot 項目中,可以通過在 application.properties 或 application.yml 文件中配置 Redis 連接信息。以下是一個示例:

spring:data:redis:timeout: 3000database: 0password: passwordport: 6379host: localhost

其中,host 和 port 分別是 Redis 服務器的地址和端口號,password 是 Redis的密碼(如果沒有密碼,可以不填),timeout 是 Redis 連接超時時間,jedis.pool 是連接池的相關設置。

3.3、創建RedisTemplate

使用 Spring Data Redis 操作 Redis,通常會使用 RedisTemplate 類。為了方便起見,我們可以創建一個工具類來管理 RedisTemplate 的創建和使用。以下是一個示例:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.util.Set;
import java.util.concurrent.TimeUnit;@Component
public class RedisUtils {/*** 如果使用 @Autowired 注解完成自動裝配 那么* RedisTemplate要么不指定泛型,要么泛型 為<Stirng,String> 或者<Object,Object>* 如果你使用其他類型的 比如RedisTemplate<String,Object>* 那么請使用 @Resource 注解* */@Resourceprivate RedisTemplate<String,Object> redisTemplate;private Logger logger = LoggerFactory.getLogger(this.getClass());/*** 緩存value** @param key -* @param value -* @param time -* @return -*/public boolean cacheValue(String key, Object value, long time) {try {ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();valueOperations.set(key, value);if (time > 0) {// 如果有設置超時時間的話redisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Throwable e) {logger.error("緩存[" + key + "]失敗, value[" + value + "] " + e.getMessage());}return false;}/*** 緩存value,沒有設置超時時間** @param key -* @param value -* @return -*/public boolean cacheValue(String key, Object value) {return cacheValue(key, value, -1);}/*** 判斷緩存是否存在** @param key* @return*/public boolean containsKey(String key) {try {return redisTemplate.hasKey(key);} catch (Throwable e) {logger.error("判斷緩存是否存在時失敗key[" + key + "]", "err[" + e.getMessage() + "]");}return false;}/*** 根據key,獲取緩存** @param key -* @return -*/public Object getValue(String key) {try {ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();return valueOperations.get(key);} catch (Throwable e) {logger.error("獲取緩存時失敗key[" + key + "]", "err[" + e.getMessage() + "]");}return null;}/*** 移除緩存** @param key -* @return -*/public boolean removeValue(String key) {try {redisTemplate.delete(key);return true;} catch (Throwable e) {logger.error("移除緩存時失敗key[" + key + "]", "err[" + e.getMessage() + "]");}return false;}/*** 根據前綴移除所有以傳入前綴開頭的key-value** @param pattern -* @return -*/public boolean removeKeys(String pattern) {try {Set<String> keySet = redisTemplate.keys(pattern + "*");redisTemplate.delete(keySet);return true;} catch (Throwable e) {logger.error("移除key[" + pattern + "]前綴的緩存時失敗", "err[" + e.getMessage() + "]");}return false;}}

在這個示例中,我們使用 @Resource 注解自動注入了一個 RedisTemplate<String, Object> 對象。然后,我們提供了三個方法來對 Redis 進行操作:cacheValue 方法用于緩存數據,getValue 方法用于獲取緩存數據,removeValue 方法用于刪除緩存數據。這些方法都是通過 redisTemplate 對象來實現的。

需要注意的是,在使用 RedisTemplate 時,需要指定鍵值對的類型。在這個示例中,我們指定了鍵的類型為 String,值的類型為 Object。

3.4、使用RedisTemplate

在上面的示例中,我們已經創建了一個 RedisTemplate 對象,并提供了一些方法來對 Redis 進行操作。現在,我們可以在 SpringBoot 項目中的任何地方使用這個工具類來進行緩存操作。以下是一個示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@Autowiredprivate RedisUtils redisUtils;@Autowiredprivate UserService userService;@GetMapping("/users/{id}")public User getUserById(@PathVariable Long id) {String key = "user_" + id;User user = (User) redisUtils.getValue(key);if (user == null) {user = userService.getUserById(id);redisUtils.cacheValue(key, user);}return user;}
}

在這個示例中,我們創建了一個 UserController 類,用于處理 HTTP 請求。在 getUserById 方法中,我們首先構造了一個緩存的 key,然后使用 redisUtils.getValue 方法從 Redis 中獲取緩存數據。如果緩存中沒有數據,我們調用 userService.getUserById 方法從數據庫中獲取數據,并使用 redisUtils.cacheValue 方法將數據存入Redis緩存中。最后,返回獲取到的數據。

通過這個示例,我們可以看到,在S pringBoot 項目中使用 Redis 作為緩存的流程。我們首先需要添加 Redis 依賴,然后在配置文件中配置 Redis 連接信息。接著,我們創建了一個 RedisUtil s工具類來管理 RedisTemplate 的創建和使用。最后,我們在控制器中使用 RedisUtils 來對 Redis 進行緩存操作。

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

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

相關文章

mac m1上系統內錄內部聲音的方法/無需安裝Blackhole

總所周知&#xff0c;m1的mac不能錄制桌面音頻&#xff0c;obsstudio都不行。 最快的解決方法就是下載飛書&#xff1a; 登陸后新建直播/視頻會議&#xff1a; 共享的時候選擇下面的兩個鉤上去就好了

6.RocketMQ之索引文件ConsumeQueue

本文著重分析為consumequeue/topic/queueId目錄下的索引文件。 1.ConsumeQueueStore public class ConsumeQueueStore {protected final ConcurrentMap<String>, ConcurrentMap<Integer>, ConsumeQueueInterface>> consumeQueueTable;public boolean load(…

【BUG】docker安裝nacos,瀏覽器卻無法訪問到頁面

個人主頁&#xff1a;金鱗踏雨 個人簡介&#xff1a;大家好&#xff0c;我是金鱗&#xff0c;一個初出茅廬的Java小白 目前狀況&#xff1a;22屆普通本科畢業生&#xff0c;幾經波折了&#xff0c;現在任職于一家國內大型知名日化公司&#xff0c;從事Java開發工作 我的博客&am…

Socks5、IP代理在爬蟲開發與HTTP通信中的應用

隨著互聯網的不斷發展&#xff0c;代理服務器成為網絡工程師和數據爬蟲開發者的關鍵工具。本文將深入探討Socks5代理、IP代理以及它們在網絡安全、爬蟲開發和HTTP通信中的重要作用。 1. 代理服務器&#xff1a;保障隱私與安全的中間人 代理服務器是位于客戶端與目標服務器之間…

object獲取的兩種方式/Object.keys使用/解構賦值

object獲取的兩種方式&#xff1a; data() {return {abj: {aa: {A: 1}}}},created() {console.log(this.abj.aa) //第一種console.log(this.abj["aa"]) //第二種}, Object.keys使用/解構賦值&#xff1a; return {footList: [],abj: {aa: {A: 12,AA:22},bb: {…

軟件工程概述-架構師(三)

軟件工程概述&#xff08;老版&#xff09; 軟件開發生命周期&#xff1a; 軟件定義時期&#xff1a;包括 可行性研究和詳細需求分析過程&#xff0c;任務是軟件工程必需完成的目標&#xff0c;具有可行問題分析、可行性研究、需求分析等。軟件開發時期&#xff1a;軟件的 設…

20230818 數據庫自整理部分

并發事務 臟讀 一個事務讀取到另一事務還沒有提交的數據 事務B讀取了事務A還沒有提交的數據 不可重復讀 一個事務先后讀取同一條記錄&#xff0c;但是兩次讀取的數據不同&#xff0c;稱之為不可重復讀 查詢出來的數據不一樣 1步驟b還沒有提交 3步驟b已經提交 幻讀 一個…

SOLIDWORKS 2023中裝配體配合的正確使用方法 碩迪科技

-SOLIDWORKS 裝配體打開時是由不同的階段和性能檢查組成的。如果在創建裝配體時未應用基本的配合方法&#xff0c;問題會隨著時間的推移而累積&#xff0c;并且在使用時會出現明顯的速度減慢。 如果您的裝配體運行速度很慢&#xff0c;則很可能是在創建配合時出現了不良操作的癥…

C#如何遍歷類的屬性,并獲取描述/注釋

要獲取屬性的描述/注釋&#xff0c;需要使用System.ComponentModel命名空間中的DescriptionAttribute。可以通過反射獲取屬性上的DescriptionAttribute&#xff0c;并獲取其Description屬性值。 首先&#xff0c;需要引入System.ComponentModel命名空間&#xff1a; using Sy…

貝葉斯推理問題、MCMC和變分推理

一、說明 1.1 介紹 貝葉斯推理是統計學中的一個主要問題&#xff0c;在許多機器學習方法中也會遇到。例如&#xff0c;用于分類的高斯混合模型或用于主題建模的潛在狄利克雷分配都是在擬合數據時需要解決此類問題的圖形模型。 同時&#xff0c;可以注意到&#xff0c;貝葉斯推…

vscode ssh 遠程 gdb 調試

一、點運行與調試&#xff0c;生成launch.json 文件 二、點添加配置&#xff0c;選擇GDB 三、修改啟動程序路徑

Python自動化實戰之使用Selenium進行Web自動化詳解

概要 為了完成一項重復的任務&#xff0c;你需要在網站上進行大量的點擊和操作&#xff0c;每次都要浪費大量的時間和精力。Python的Selenium庫就可以自動化完成這些任務。 在本篇文章中&#xff0c;我們將會介紹如何使用Python的Selenium庫進行Web自動化&#xff0c;以及如何…

Kubernetes網絡組件詳解

目錄 1、Kubernetes網絡組件 1.1、Flannel網絡組件 1.2、Calico 網絡插件 2、環境準備 2.1、主機初始化配置 2.2、部署docker環境 3、部署kubernetes集群 3.1、組件介紹 3.2、配置阿里云yum源 3.3、安裝kubelet kubeadm kubectl 3.4、配置init-config.yaml 3.5、安裝…

jenkinsfile自動部署接口

復制創建新流水線 從預先創建的job中獲取 config.xml 或根據需要創建另一個 curl -X GET http://xxx.xxx.xxxx.com/job/backup-data/config.xml -u test:xxxxxxxxxxxxxxxxxx-o config.xml 生成Crumb CRUMB$(curl -s http://xxxxxxx.xxx.xxx.com/crumbIssuer/api/xml?xpathc…

精彩回顧 | 迪捷軟件出席2023ATC汽車電子與軟件技術周

2023年8月18日&#xff0c;由ATC汽車技術會議主辦&#xff0c;上海市集成電路行業協會支持的“2023ATC汽車電子與軟件技術周”在上海市圓滿落幕。迪捷軟件上海參展之行圓滿收官。 ▲開幕式 本次峰會匯聚了整車廠、汽車零部件集團、軟硬件方案提供商、軟件工具供應商、軟件測試…

Ladp數據庫安裝和配置自定義schema ,Centos7環境

最近安裝ldap看了不少教程&#xff0c;整理下用到的有用的資料&#xff0c;并把自己的搭建過程分享。 參考 ldap介紹&#xff1a;openLDAP入門與安裝 官方文檔&#xff1a;https://www.openldap.org/doc/admin22/schema.html 安裝配置&#xff1a;Centos7 搭建openldap完整詳…

flask模型部署教程

搭建python flask服務的步驟 1、安裝相關的包 具體參考https://blog.csdn.net/weixin_42126327/article/details/127642279 1、安裝conda環境和相關包 # 一、安裝conda # 1、首先&#xff0c;前往Anaconda官網&#xff08;https://www.anaconda.com/products/individual&am…

【K8S源碼之Pod漂移】整體概況分析 controller-manager 中的 nodelifecycle controller(Pod的驅逐)

參考 k8s 污點驅逐詳解-源碼分析 - 掘金 k8s驅逐篇(5)-kube-controller-manager驅逐 - 良凱爾 - 博客園 k8s驅逐篇(6)-kube-controller-manager驅逐-NodeLifecycleController源碼分析 - 良凱爾 - 博客園 k8s驅逐篇(7)-kube-controller-manager驅逐-taintManager源碼分析 - 良…

esp32C3 micropython oled 恐龍快跑游戲

目錄 簡介 效果展示 源代碼 main.py ssd1306.py 實現思路 血量值 分數 恐龍 障礙物 得分與血量值的計算 簡介 使用合宙esp32c3模塊&#xff0c;基于micropython平臺開發的一款oled小游戲&#xff0c;恐龍快跑&#xff0c;所有代碼已經給出&#xff0c;將兩個py文件…

【Maven教程】(一)入門介紹篇:Maven基礎概念與其他構建工具:理解構建過程與Maven的多重作用,以及與敏捷開發的關系 ~

Maven入門介紹篇 1?? 基礎概念1.1 構建1.2 maven對構建的支持1.3 Maven的其他作用 2?? 其他構建工具2.1 IDE2.2 Make2.3 Ant2.4 Jenkins 3?? Maven與敏捷開發&#x1f33e; 總結 1?? 基礎概念 "Maven"可以翻譯為 “知識的積累者” 或 “專家”。這個詞源于波…