【Redis實踐篇】使用Redisson 優雅實現項目實踐過程中的5種場景

文章目錄

  • 1.前言
  • 2.使用方式
    • 1. 添加Redisson依賴:
    • 2. 配置Redis連接信息
    • 3. 使用場景
      • 3.1. 分布式鎖
      • 3.2. 限流器(Rate Limiter)
      • 3.3. 可過期的對象(Expirable Object)
      • 3.4. 信號量(Semaphore)
      • 3.5. 分布式調度器(Distributed Scheduler)
  • 5. 源碼地址
  • 6. Redis從入門到精通系列文章
  • 7.參考文檔

在這里插入圖片描述

1.前言

Redisson是一個基于Redis的分布式Java對象和數據結構庫,它提供了豐富的功能和易于使用的API,使開發人員能夠輕松地在分布式環境中操作和管理數據。

作為一個分布式對象和數據結構庫,Redisson提供了許多常見的數據結構和算法的實現,包括通用對象桶、二進制流、地理空間對象桶、BitSet、原子長整型、原子雙精度浮點數、話題(訂閱分發)、布隆過濾器和基數估計算法。這些數據結構和算法為開發人員提供了處理分布式數據的工具,從而簡化了復雜性,提高了效率。簡直就是一個Redis的最佳實踐框架和最牛X的Redis客戶端工具寶箱,基本上覆蓋了所有場景

通過Redisson,開發人員可以使用簡單而一致的API來存儲和檢索對象,處理二進制數據,管理地理位置信息,操作位集合,進行原子操作,進行發布-訂閱消息傳遞,實現布隆過濾器和基數估計等功能。Redisson還提供了許多附加功能,如分布式鎖、分布式信號量、分布式隊列和分布式限流器等,進一步增強了分布式應用的能力。

Redisson的設計目標是提供高性能、可擴展和可靠的分布式數據操作解決方案。它與Redis數據庫緊密集成,并利用Redis的特性來實現分布式對象和數據結構的存儲和管理。Redisson還支持與Spring框架的無縫集成,使開發人員能夠更方便地在Spring應用程序中使用Redisson功能。

所以我們本篇文章了解一下Redisson 在項目實踐中最常用的5種場景,分別搞了一個示例方便大家理解
在這里插入圖片描述

2.使用方式

1. 添加Redisson依賴:

在Spring Boot項目的pom.xml文件中添加Redisson的依賴。

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.15.5</version>
</dependency>

2. 配置Redis連接信息

在Spring Boot項目的application.properties或application.yml文件中配置Redis連接信息,包括主機地址、端口、密碼等。例如:

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=

3. 使用場景

3.1. 分布式鎖

例如,你可以在Spring Boot的Service類中注入RedissonClient并使用它進行操作:

import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {@Autowiredprivate RedissonClient redissonClient;public void myMethod() {// 獲取分布式鎖RLock lock = redissonClient.getLock("myLock");try {// 嘗試加鎖,如果加鎖成功,則執行加鎖后的邏輯if (lock.tryLock()) {// 執行加鎖后的邏輯// ...}} finally {// 釋放鎖lock.unlock();}}}

3.2. 限流器(Rate Limiter)

import org.redisson.api.RRateLimiter;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MyService {@Autowiredprivate   RedissonClient redissonClient;public void myMethod() {// 獲取限流器RRateLimiter limiter = redissonClient.getRateLimiter("myLimiter");// 定義限流速率,例如每秒最多允許10個操作limiter.trySetRate(RateType.OVERALL, 10, 1, RateIntervalUnit.SECONDS);// 嘗試獲取許可boolean acquired = limiter.tryAcquire();if (acquired) {// 執行需要限流的操作// ...} else {// 限流邏輯,例如返回錯誤信息或執行降級處理// ...}}
}

3.3. 可過期的對象(Expirable Object)

在Redis中,Hash結構是一種用于存儲鍵值對的數據結構。每個Hash結構都可以包含多個字段(field)和對應的值(value)。而要為Hash結構中的二級key設置過期時間,可以使用Redisson的RMapCache接口。如果使用Redisson 來實現對Hash結構中二級key的值設置過期時間,其實很簡單了。

我們使用redissonClient.getMapCache("myHash")獲取一個名為"myHash"的可過期對象的Hash結構。然后,我們可以使用put()方法將具有過期時間的二級鍵值對存儲到Hash結構中,并指定過期時間和時間單位。存儲的二級鍵值對將會在指定的過期時間后自動過期。

setHashValueWithExpiration()方法中,我們傳入Hash結構的一級鍵(hashKey)、二級鍵(fieldKey)、值(value)、過期時間和時間單位,將值存儲到Hash結構中的二級鍵,并為其設置過期時間。

getHashValue()方法中,我們根據Hash結構的一級鍵和二級鍵從Hash結構中獲取對應的值。

通過使用Redisson的RMapCache接口,你可以方便地為Hash結構中的二級鍵值對設置過期時間,并且無需手動處理過期邏輯。Redisson會自動管理過期和清理操作,簡化了在分布式環境中使用可過期的Hash結構的開發工作。

import org.redisson.api.RMapCache;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;@Component
public class HashService {@Autowiredprivate  RedissonClient redissonClient;public void setHashValueWithExpiration(String hashKey, String fieldKey, Object value, long expirationTime, TimeUnit timeUnit) {RMapCache<String, Object> hash = redissonClient.getMapCache("myHash");hash.put(hashKey, fieldKey, value, expirationTime, timeUnit);}public Object getHashValue(String hashKey, String fieldKey) {RMapCache<String, Object> hash = redissonClient.getMapCache("myHash");return hash.get(hashKey, fieldKey);}
}

3.4. 信號量(Semaphore)

redissonClient.getSemaphore(“mySemaphore”)獲取一個名為"mySemaphore"的信號量。然后,使用trySetPermits()方法設置信號量的初始數量,例如設置為10個。在myMethod()方法中,我們使用acquire()方法嘗試獲取信號量,如果獲取到信號量,則執行需要受信號量限制的操作。在操作完成后,使用release()方法釋放信號量。

  • 通過使用Redisson的信號量功能,你可以控制在分布式環境中對某個資源的并發訪問數量,限制并發訪問的能力,從而保護資源的穩定性和可用性。
import org.redisson.api.RSemaphore;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class ResourceService {private final RedissonClient redissonClient;@Autowiredpublic ResourceService(RedissonClient redissonClient) {this.redissonClient = redissonClient;}public void accessResource() {RSemaphore resourceSemaphore = redissonClient.getSemaphore("resourceSemaphore");resourceSemaphore.trySetPermits(10);try {resourceSemaphore.acquire();// 執行需要受信號量限制的操作,訪問資源// ...} catch (InterruptedException e) {// 處理中斷異常// ...} finally {resourceSemaphore.release();}}
}

3.5. 分布式調度器(Distributed Scheduler)

我們使用redissonClient.getMapCache("myHash")獲取一個名為"myHash"的可過期對象的Hash結構。然后,我們可以使用put()方法將具有過期時間的二級鍵值對存儲到Hash結構中,并指定過期時間和時間單位。存儲的二級鍵值對將會在指定的過期時間后自動過期。

setHashValueWithExpiration()方法中,我們傳入Hash結構的一級鍵(hashKey)、二級鍵(fieldKey)、值(value)、過期時間和時間單位,將值存儲到Hash結構中的二級鍵,并為其設置過期時間。

getHashValue()方法中,我們根據Hash結構的一級鍵和二級鍵從Hash結構中獲取對應的值。

通過使用Redisson的RMapCache接口,你可以方便地為Hash結構中的二級鍵值對設置過期時間,并且無需手動處理過期邏輯。Redisson會自動管理過期和清理操作,簡化了在分布式環境中使用可過期的Hash結構的開發工作。

import org.redisson.api.RScheduledExecutorService;
import org.redisson.api.RedissonClient;
import org.redisson.api.annotation.RInject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;@Component
public class DistributedScheduler {private final RedissonClient redissonClient;@Autowiredpublic DistributedScheduler(RedissonClient redissonClient) {this.redissonClient = redissonClient;}/*** 安排一個延遲執行的分布式任務** @param task      要執行的任務* @param delay     延遲時間* @param timeUnit  時間單位*/public void scheduleTask(Runnable task, long delay, TimeUnit timeUnit) {RScheduledExecutorService executorService = redissonClient.getExecutorService("myScheduler");executorService.schedule(task, delay, timeUnit);}/*** 安排一個以固定速率重復執行的分布式任務** @param task          要執行的任務* @param initialDelay  初始延遲時間* @param period        重復執行的周期* @param timeUnit      時間單位*/public void scheduleTaskAtFixedRate(Runnable task, long initialDelay, long period, TimeUnit timeUnit) {RScheduledExecutorService executorService = redissonClient.getExecutorService("myScheduler");executorService.scheduleAtFixedRate(task, initialDelay, period, timeUnit);}
}

5. 源碼地址

https://github.com/wangshuai67/Redis-Tutorial-2023

6. Redis從入門到精通系列文章

  • 《Redis使用Lua腳本和Redisson來保證庫存扣減中的原子性和一致性》
  • 《SpringBoot Redis 使用Lettuce和Jedis配置哨兵模式》
  • 《Redis【應用篇】之RedisTemplate基本操作》
  • 《Redis 從入門到精通【實踐篇】之SpringBoot配置Redis多數據源》
  • 《Redis 從入門到精通【進階篇】之三分鐘了解Redis HyperLogLog 數據結構》
  • 《Redis 從入門到精通【進階篇】之三分鐘了解Redis地理位置數據結構GeoHash》
  • 《Redis 從入門到精通【進階篇】之高可用哨兵機制(Redis Sentinel)詳解》
  • 《Redis 從入門到精通【進階篇】之redis主從復制詳解》
  • 《Redis 從入門到精通【進階篇】之Redis事務詳解》
  • 《Redis從入門到精通【進階篇】之對象機制詳解》
  • 《Redis從入門到精通【進階篇】之消息傳遞發布訂閱模式詳解》
  • 《Redis從入門到精通【進階篇】之持久化 AOF詳解》
  • 《Redis從入門到精通【進階篇】之持久化RDB詳解》
  • 《Redis從入門到精通【高階篇】之底層數據結構字典(Dictionary)詳解》
  • 《Redis從入門到精通【高階篇】之底層數據結構快表QuickList詳解》
  • 《Redis從入門到精通【高階篇】之底層數據結構簡單動態字符串(SDS)詳解》
  • 《Redis從入門到精通【高階篇】之底層數據結構壓縮列表(ZipList)詳解》
  • 《Redis從入門到精通【進階篇】之數據類型Stream詳解和使用示例》
    在這里插入圖片描述大家好,我是冰點,今天的【Redis實踐篇】使用Redisson 優雅實現項目實踐過程中的5種場景,全部內容就是這些。如果你有疑問或見解可以在評論區留言。

7.參考文檔

Redisson官方文檔 https://github.com/redisson/redisson/wiki/Table-of-Content

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

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

相關文章

ChatGPT在智能文檔搜索和信息抽取中的應用如何?

智能文檔搜索和信息抽取是信息檢索和知識管理領域中的關鍵問題&#xff0c;而ChatGPT作為一種強大的自然語言處理模型&#xff0c;正在這些領域發揮越來越重要的作用。在大數據時代&#xff0c;文檔數量龐大&#xff0c;信息量巨大&#xff0c;有效地搜索和抽取信息變得至關重要…

spfa判斷負環

思路&#xff1a; &#xff08;1&#xff09;負環&#xff1a;區別于正環&#xff0c;在求最短路過程中&#xff0c;正環會繞路&#xff0c;故不會被討論&#xff0c;而負環會不斷讓路總權更短&#xff0c;會讓算法不斷循環&#xff1b; &#xff08;2&#xff09;于是考慮統…

JVM---垃圾回收算法介紹

目錄 分代收集理論 三種垃圾回收算法 標記-清除算法&#xff08;最基礎的、基本不用&#xff09; 標記-復制算法 標記-整理算法 正式因為jvm有了垃圾回收機制&#xff0c;作為java開發者不會去特備關注內存&#xff0c;不像C和C。 優點&#xff1a;開發門檻低、安全 缺點…

windows Socket簡單編程實例

服務端 #include <winsock2.h> #include <string.h> #include <stdio.h> #include <stdlib.h>#pragma comment(lib, "Ws2_32.lib")void error_handing(const char* message) {fputs(message, stderr);fputc(\n, stderr);exit(1); } int mai…

任我行CRM系統存在 SQL注入漏洞[2023-HW]

任我行CRM系統存在 SQL注入漏洞 一、 產品簡介二、 漏洞概述三、 復現環境四、 漏洞復現小龍POC又是一通哈拉少 五、 修復建議 免責聲明&#xff1a;請勿利用文章內的相關技術從事非法測試&#xff0c;由于傳播、利用此文所提供的信息或者工具而造成的任何直接或者間接的后果及…

學習ts(二)數據類型(接口和對象類型、數組類型)

interface 重名會重合到一起 如果兩個interface名稱相同&#xff0c;會把兩個合到一起 重復定義同一個需要類型相同 不能多或者減少屬性 設置任意key 當定義接口返回數據時&#xff0c;我們不確定接口會返回多少&#xff0c;知道所需要的固定屬性&#xff0c;其余屬性可以…

學習筆記十四:K8S最小調度單元POD概述

K8S最小調度單元POD概述 k8s核心資源Pod介紹Pod是什么Pod如何管理多個容器Pod網絡Pod存儲代碼自動發版更新收集業務日志 Pod工作方式自主式Pod控制器管理的Pod(防誤刪除) 如何基于Pod運行應用 k8s核心資源Pod介紹 K8s官方文檔&#xff1a;https://kubernetes.io/ K8s中文官方文…

【博客692】grafana如何解決step動態變化時可能出現range duration小于step

grafana如何解決step動態變化時可能出現range duration小于step 1、grafana中的step和resolution grafana中的 “step” grafana本身是沒有提供step參數的&#xff0c;因為儀表盤根據查詢數據區間以及儀表盤線條寬度等&#xff0c;對于不同查詢&#xff0c;相同的step并不能…

校園外賣小程序怎么做

校園外賣小程序是為滿足校園內學生和教職員工的外賣需求而開發的一種應用程序。它涵蓋了從用戶端、商家端、騎手端、電腦管理員到小票打印、多商戶入駐等多個方面的功能&#xff0c;以下將逐一介紹。 1. 用戶端功能&#xff1a;校園外賣小程序為用戶提供了便捷的訂餐和外賣服務…

Zmq適配Win7 SP0 / Win XP/ Win 2k

1.目的 由于發布版本的libzmq使用了較多新的系統特性&#xff0c;導致在低版本windows平臺上無法使用。 因此&#xff0c;需要對zmq源碼進行修改以適配低版本的系統&#xff0c;如Win7 SP0&#xff0c;Win XP&#xff0c;Win2003等等。 2.Win7 SP0 #if defined ZMQ_HAVE_WIN…

深入理解epoll

文章目錄 概述1. epoll_create - 創建一個epoll實例2. epoll_ctl - 控制epoll實例的事件結構體介紹events取值&#xff1a;data&#xff1a; 聯合體&#xff08;共用體&#xff09;&#xff1a; 3. epoll_wait - 等待事件發生偽代碼總結 概述 在網絡編程中&#xff0c;高效地處…

每天一道leetcode:797. 所有可能的路徑(圖論中等深度優先遍歷)

今日份題目&#xff1a; 給你一個有 n 個節點的 有向無環圖&#xff08;DAG&#xff09;&#xff0c;請你找出所有從節點 0 到節點 n-1 的路徑并輸出&#xff08;不要求按特定順序&#xff09; graph[i] 是一個從節點 i 可以訪問的所有節點的列表&#xff08;即從節點 i 到節…

c++11 explicit關鍵字的作用

explicit 在C中&#xff0c;explicit關鍵字用來修飾類的構造函數&#xff0c;被修飾的構造函數的類&#xff0c;不能發生相應的隱式類型轉換&#xff0c;只能以顯示的方式進行類型轉換。因為無參構造函數和多參構造函數本身就是顯示調用的。再加上explicit關鍵字也沒有什么意義…

?五金件機器視覺定位?并獲取外觀輪廓軟硬件視覺方案

【檢測目的】 五金件機器視覺定位&#xff0c;視覺檢測五金件輪廓并矯正五金件位置進行涂油 【客戶要求】 FOV:540*400mm 【拍攝與處理效圖一】 【拍攝與處理效圖二】 【實驗原理及說明】 【方案評估】 根據目前的圖像和處理結果來看&#xff0c;可以檢測出產品輪廓并進行位置…

HCIP-OpenStack搭建

1、OpenStack概述 OpenStack是一種云操作系統&#xff0c;OpenStack是虛擬機、裸金屬和容器的云基礎架構。可控制整個數據中心的大型計算、存儲和網絡資源池&#xff0c;所有資源都通過具有通用身份驗證機制的API進行管理和配置。管理員也可通過Web界面控制&#xff0c;同時授…

Qt 之 QPushButton,信號與槽機制

文章目錄 前言一、QPushButton二、信號與槽機制總結 前言 一、QPushButton 當我們開發基于Qt框架的圖形用戶界面&#xff08;GUI&#xff09;應用程序時&#xff0c;經常需要在界面上添加按鈕來實現用戶交互。Qt提供了一個名為 QPushButton 的類作為按鈕控件的實現。QPushButt…

基于RoCE的應用程序的MTU注意事項

目錄 基于RoCE的應用程序的MTU注意事項 探測網絡中的MTU設置 概要 原文 MTU測試結果 DOC: CentOS安裝tshark抓包工具 基于RoCE的應用程序的MTU注意事項 原文&#xff1a;https://support.mellanox.com/s/article/MLNX2-117-1682kn InfiniBand協議最大傳輸單元&#xff…

WSL2 Ubuntu子系統安裝OpenCV

文章目錄 前言一、&#xfeff;基本概念二、操作步驟1.下載源碼2.安裝依賴3.運行編譯4.配置路徑 前言 OpenCV用C語言編寫&#xff0c;它的主要接口也是C語言&#xff0c;但是依然保留了大量的C語言接口。該庫也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。這些語…

C#委托事件的區別

在C#中&#xff0c;委托&#xff08;delegate&#xff09;和事件&#xff08;event&#xff09;經常一起使用&#xff0c;但它們之間確實有一些基本的區別&#xff1a; 委托&#xff08;Delegate&#xff09;&#xff1a;委托是一個引用類型&#xff0c;它可以引用一個或多個具…

[python] 安裝numpy+scipy+matlotlib+scikit-learn及問題解決

這篇文章主要講述Python如何安裝Numpy、Scipy、Matlotlib、Scikit-learn等庫的過程及遇到的問題解決方法。最近安裝這個真是一把淚啊&#xff0c;各種不兼容問題和報錯&#xff0c;希望文章對你有所幫助吧&#xff01;你可能遇到的問題包括&#xff1a; ImportError: N…