文章目錄
- 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