
1.前言
Redisson是一個(gè)基于Redis的分布式Java對(duì)象和數(shù)據(jù)結(jié)構(gòu)庫(kù),它提供了豐富的功能和易于使用的API,使開(kāi)發(fā)人員能夠輕松地在分布式環(huán)境中操作和管理數(shù)據(jù)。
作為一個(gè)分布式對(duì)象和數(shù)據(jù)結(jié)構(gòu)庫(kù),Redisson提供了許多常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)和算法的實(shí)現(xiàn),包括通用對(duì)象桶、二進(jìn)制流、地理空間對(duì)象桶、BitSet、原子長(zhǎng)整型、原子雙精度浮點(diǎn)數(shù)、話題(訂閱分發(fā))、布隆過(guò)濾器和基數(shù)估計(jì)算法。這些數(shù)據(jù)結(jié)構(gòu)和算法為開(kāi)發(fā)人員提供了處理分布式數(shù)據(jù)的工具,從而簡(jiǎn)化了復(fù)雜性,提高了效率。簡(jiǎn)直就是一個(gè)Redis的最佳實(shí)踐框架和最牛X的Redis客戶端工具寶箱,基本上覆蓋了所有場(chǎng)景
。
通過(guò)Redisson,開(kāi)發(fā)人員可以使用簡(jiǎn)單而一致的API來(lái)存儲(chǔ)和檢索對(duì)象,處理二進(jìn)制數(shù)據(jù),管理地理位置信息,操作位集合,進(jìn)行原子操作,進(jìn)行發(fā)布-訂閱消息傳遞,實(shí)現(xiàn)布隆過(guò)濾器和基數(shù)估計(jì)等功能。Redisson還提供了許多附加功能,如分布式鎖、分布式信號(hào)量、分布式隊(duì)列和分布式限流器等,進(jìn)一步增強(qiáng)了分布式應(yīng)用的能力。
Redisson的設(shè)計(jì)目標(biāo)是提供高性能、可擴(kuò)展和可靠的分布式數(shù)據(jù)操作解決方案。它與Redis數(shù)據(jù)庫(kù)緊密集成,并利用Redis的特性來(lái)實(shí)現(xiàn)分布式對(duì)象和數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)和管理。Redisson還支持與Spring框架的無(wú)縫集成,使開(kāi)發(fā)人員能夠更方便地在Spring應(yīng)用程序中使用Redisson功能。
所以我們本篇文章了解一下Redisson 在項(xiàng)目實(shí)踐中最常用的5種場(chǎng)景,分別搞了一個(gè)示例方便大家理解。
2.使用方式
1. 添加Redisson依賴:
在Spring Boot項(xiàng)目的pom.xml文件中添加Redisson的依賴。
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.15.5</version>
</dependency>
2. 配置Redis連接信息
在Spring Boot項(xiàng)目的application.properties或application.yml文件中配置Redis連接信息,包括主機(jī)地址、端口、密碼等。例如:
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
3. 使用場(chǎng)景
3.1. 分布式鎖
例如,你可以在Spring Boot的Service類中注入RedissonClient并使用它進(jìn)行操作:
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MyService {
@Autowired
private RedissonClient redissonClient;
public void myMethod() {
// 獲取分布式鎖
RLock lock = redissonClient.getLock("myLock");
try {
// 嘗試加鎖,如果加鎖成功,則執(zhí)行加鎖后的邏輯
if (lock.tryLock()) {
// 執(zhí)行加鎖后的邏輯
// ...
}
} 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 {
@Autowired
private RedissonClient redissonClient;
public void myMethod() {
// 獲取限流器
RRateLimiter limiter = redissonClient.getRateLimiter("myLimiter");
// 定義限流速率,例如每秒最多允許10個(gè)操作
limiter.trySetRate(RateType.OVERALL, 10, 1, RateIntervalUnit.SECONDS);
// 嘗試獲取許可
boolean acquired = limiter.tryAcquire();
if (acquired) {
// 執(zhí)行需要限流的操作
// ...
} else {
// 限流邏輯,例如返回錯(cuò)誤信息或執(zhí)行降級(jí)處理
// ...
}
}
}
3.3. 可過(guò)期的對(duì)象(Expirable Object)
在Redis中,Hash結(jié)構(gòu)是一種用于存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)。每個(gè)Hash結(jié)構(gòu)都可以包含多個(gè)字段(field)和對(duì)應(yīng)的值(value)。而要為Hash結(jié)構(gòu)中的二級(jí)key設(shè)置過(guò)期時(shí)間,可以使用Redisson的RMapCache接口。如果使用Redisson 來(lái)實(shí)現(xiàn)對(duì)Hash結(jié)構(gòu)中二級(jí)key的值設(shè)置過(guò)期時(shí)間,其實(shí)很簡(jiǎn)單了。
我們使用redissonClient.getMapCache("myHash")
獲取一個(gè)名為"myHash"的可過(guò)期對(duì)象的Hash結(jié)構(gòu)。然后,我們可以使用put()
方法將具有過(guò)期時(shí)間的二級(jí)鍵值對(duì)存儲(chǔ)到Hash結(jié)構(gòu)中,并指定過(guò)期時(shí)間和時(shí)間單位。存儲(chǔ)的二級(jí)鍵值對(duì)將會(huì)在指定的過(guò)期時(shí)間后自動(dòng)過(guò)期。
在setHashValueWithExpiration()
方法中,我們傳入Hash結(jié)構(gòu)的一級(jí)鍵(hashKey)、二級(jí)鍵(fieldKey)、值(value)、過(guò)期時(shí)間和時(shí)間單位,將值存儲(chǔ)到Hash結(jié)構(gòu)中的二級(jí)鍵,并為其設(shè)置過(guò)期時(shí)間。
在getHashValue()
方法中,我們根據(jù)Hash結(jié)構(gòu)的一級(jí)鍵和二級(jí)鍵從Hash結(jié)構(gòu)中獲取對(duì)應(yīng)的值。
通過(guò)使用Redisson的RMapCache
接口,你可以方便地為Hash結(jié)構(gòu)中的二級(jí)鍵值對(duì)設(shè)置過(guò)期時(shí)間,并且無(wú)需手動(dòng)處理過(guò)期邏輯。Redisson會(huì)自動(dòng)管理過(guò)期和清理操作,簡(jiǎn)化了在分布式環(huán)境中使用可過(guò)期的Hash結(jié)構(gòu)的開(kāi)發(fā)工作。
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 {
@Autowired
private 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. 信號(hào)量(Semaphore)
redissonClient.getSemaphore(“mySemaphore”)獲取一個(gè)名為"mySemaphore"的信號(hào)量。然后,使用trySetPermits()方法設(shè)置信號(hào)量的初始數(shù)量,例如設(shè)置為10個(gè)。在myMethod()方法中,我們使用acquire()方法嘗試獲取信號(hào)量,如果獲取到信號(hào)量,則執(zhí)行需要受信號(hào)量限制的操作。在操作完成后,使用release()方法釋放信號(hào)量。
- 通過(guò)使用Redisson的信號(hào)量功能,你可以控制在分布式環(huán)境中對(duì)某個(gè)資源的并發(fā)訪問(wèn)數(shù)量,限制并發(fā)訪問(wèn)的能力,從而保護(hù)資源的穩(wěn)定性和可用性。
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;
@Autowired
public ResourceService(RedissonClient redissonClient) {
this.redissonClient = redissonClient;
}
public void accessResource() {
RSemaphore resourceSemaphore = redissonClient.getSemaphore("resourceSemaphore");
resourceSemaphore.trySetPermits(10);
try {
resourceSemaphore.acquire();
// 執(zhí)行需要受信號(hào)量限制的操作,訪問(wèn)資源
// ...
} catch (InterruptedException e) {
// 處理中斷異常
// ...
} finally {
resourceSemaphore.release();
}
}
}
3.5. 分布式調(diào)度器(Distributed Scheduler)
我們使用redissonClient.getMapCache("myHash")
獲取一個(gè)名為"myHash"的可過(guò)期對(duì)象的Hash結(jié)構(gòu)。然后,我們可以使用put()
方法將具有過(guò)期時(shí)間的二級(jí)鍵值對(duì)存儲(chǔ)到Hash結(jié)構(gòu)中,并指定過(guò)期時(shí)間和時(shí)間單位。存儲(chǔ)的二級(jí)鍵值對(duì)將會(huì)在指定的過(guò)期時(shí)間后自動(dòng)過(guò)期。
在setHashValueWithExpiration()
方法中,我們傳入Hash結(jié)構(gòu)的一級(jí)鍵(hashKey)、二級(jí)鍵(fieldKey)、值(value)、過(guò)期時(shí)間和時(shí)間單位,將值存儲(chǔ)到Hash結(jié)構(gòu)中的二級(jí)鍵,并為其設(shè)置過(guò)期時(shí)間。
在getHashValue()
方法中,我們根據(jù)Hash結(jié)構(gòu)的一級(jí)鍵和二級(jí)鍵從Hash結(jié)構(gòu)中獲取對(duì)應(yīng)的值。
通過(guò)使用Redisson的RMapCache
接口,你可以方便地為Hash結(jié)構(gòu)中的二級(jí)鍵值對(duì)設(shè)置過(guò)期時(shí)間,并且無(wú)需手動(dòng)處理過(guò)期邏輯。Redisson會(huì)自動(dòng)管理過(guò)期和清理操作,簡(jiǎn)化了在分布式環(huán)境中使用可過(guò)期的Hash結(jié)構(gòu)的開(kāi)發(fā)工作。
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;
@Autowired
public DistributedScheduler(RedissonClient redissonClient) {
this.redissonClient = redissonClient;
}
/**
* 安排一個(gè)延遲執(zhí)行的分布式任務(wù)
*
* @param task 要執(zhí)行的任務(wù)
* @param delay 延遲時(shí)間
* @param timeUnit 時(shí)間單位
*/
public void scheduleTask(Runnable task, long delay, TimeUnit timeUnit) {
RScheduledExecutorService executorService = redissonClient.getExecutorService("myScheduler");
executorService.schedule(task, delay, timeUnit);
}
/**
* 安排一個(gè)以固定速率重復(fù)執(zhí)行的分布式任務(wù)
*
* @param task 要執(zhí)行的任務(wù)
* @param initialDelay 初始延遲時(shí)間
* @param period 重復(fù)執(zhí)行的周期
* @param timeUnit 時(shí)間單位
*/
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文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-649068.html
6. Redis從入門到精通系列文章
- 《Redis使用Lua腳本和Redisson來(lái)保證庫(kù)存扣減中的原子性和一致性》
- 《SpringBoot Redis 使用Lettuce和Jedis配置哨兵模式》
- 《Redis【應(yīng)用篇】之RedisTemplate基本操作》
- 《Redis 從入門到精通【實(shí)踐篇】之SpringBoot配置Redis多數(shù)據(jù)源》
- 《Redis 從入門到精通【進(jìn)階篇】之三分鐘了解Redis HyperLogLog 數(shù)據(jù)結(jié)構(gòu)》
- 《Redis 從入門到精通【進(jìn)階篇】之三分鐘了解Redis地理位置數(shù)據(jù)結(jié)構(gòu)GeoHash》
- 《Redis 從入門到精通【進(jìn)階篇】之高可用哨兵機(jī)制(Redis Sentinel)詳解》
- 《Redis 從入門到精通【進(jìn)階篇】之redis主從復(fù)制詳解》
- 《Redis 從入門到精通【進(jìn)階篇】之Redis事務(wù)詳解》
- 《Redis從入門到精通【進(jìn)階篇】之對(duì)象機(jī)制詳解》
- 《Redis從入門到精通【進(jìn)階篇】之消息傳遞發(fā)布訂閱模式詳解》
- 《Redis從入門到精通【進(jìn)階篇】之持久化 AOF詳解》
- 《Redis從入門到精通【進(jìn)階篇】之持久化RDB詳解》
- 《Redis從入門到精通【高階篇】之底層數(shù)據(jù)結(jié)構(gòu)字典(Dictionary)詳解》
- 《Redis從入門到精通【高階篇】之底層數(shù)據(jù)結(jié)構(gòu)快表QuickList詳解》
- 《Redis從入門到精通【高階篇】之底層數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單動(dòng)態(tài)字符串(SDS)詳解》
- 《Redis從入門到精通【高階篇】之底層數(shù)據(jù)結(jié)構(gòu)壓縮列表(ZipList)詳解》
-
《Redis從入門到精通【進(jìn)階篇】之?dāng)?shù)據(jù)類型Stream詳解和使用示例》
大家好,我是冰點(diǎn),今天的【Redis實(shí)踐篇】使用Redisson 優(yōu)雅實(shí)現(xiàn)項(xiàng)目實(shí)踐過(guò)程中的5種場(chǎng)景,全部?jī)?nèi)容就是這些。如果你有疑問(wèn)或見(jiàn)解可以在評(píng)論區(qū)留言。
7.參考文檔
Redisson官方文檔 https://github.com/redisson/redisson/wiki/Table-of-Content文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-649068.html
到了這里,關(guān)于【Redis實(shí)踐篇】使用Redisson 優(yōu)雅實(shí)現(xiàn)項(xiàng)目實(shí)踐過(guò)程中的5種場(chǎng)景的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!