redis延時(shí)隊(duì)列的項(xiàng)目實(shí)踐
引入
<redisson.version>3.15.5</redisson.version>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>${redisson.version}</version>
</dependency>
放入延時(shí)隊(duì)列
import org.redisson.api.RedissonClient;
@Autowired
private RedissonClient redissonClient;
public static final String CardKitMessageDelayQueue = "QUEUE:CARD_KIT";
// 發(fā)送延時(shí)消息
RBlockingDeque<CardKitRedisBo> blockingDeque = redissonClient
.getBlockingDeque(CardKitMessageDelayQueue);
RDelayedQueue<CardKitRedisBo> delayedQueue = redissonClient.getDelayedQueue(blockingDeque);
// 計(jì)算時(shí)間戳
long delayInSeconds = calculateDifference(model.getSendTime(), LocalDateTime.now());
CardKitRedisBo cardKitRedisBo = new CardKitRedisBo();
cardKitRedisBo.setId(model.getId()).setTemplateId(model.getTemplateId());
delayedQueue.offer(cardKitRedisBo, delayInSeconds, TimeUnit.SECONDS);
監(jiān)聽(tīng)延時(shí)隊(duì)列
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBlockingDeque;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@Slf4j
@Component
public class CardKitMessageListener implements ApplicationRunner {
public static final String CardKitMessageDelayQueue = "QUEUE:CARD_KIT";
public static final String CardKitMessageDelayLock = "LOCK:CARD_KIT";
@Resource
private RedissonClient redissonClient;
@Autowired
private Tracer tracer;
@Autowired
private CardKitService cardKitService;
@Override
public void run(ApplicationArguments args) {
new Thread(() -> {
RBlockingDeque<CardKitRedisBo> blockingDeque = redissonClient.getBlockingDeque(CardKitMessageDelayQueue);
while (true) {
// 獲取定時(shí)任務(wù)鎖
RLock rLock = redissonClient.getLock(CardKitMessageDelayLock);
try {
// 最多等待5秒
boolean isLocked = rLock.tryLock(5, TimeUnit.SECONDS);
if (isLocked) {
Span span = tracer.nextSpan().name("OccupationMessage").start();
try (Tracer.SpanInScope ws = tracer.withSpan(span)) {
CardKitRedisBo poll = blockingDeque.take();
log.info("獲取延時(shí)消息:{}", JSONUtil.toJsonStr(poll));
// 消費(fèi)消息
cardKitService.sendCardKit(poll);
} finally {
try {
rLock.unlock();
} catch (Exception ex) {
log.warn("鎖釋放失敗:" + ex.getMessage());
}
try {
span.end();
} catch (Exception ex) {
log.error("失敗", ex)
}
}
}
} catch (Exception ex) {
log.error("延遲消息處理異常:" + ex.getMessage(), ex);
}
}
}).start();
}
}到此這篇關(guān)于redis延時(shí)隊(duì)列的文章就介紹到這了,更多相關(guān)redis延時(shí)隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Redis模擬延時(shí)隊(duì)列實(shí)現(xiàn)日程提醒的方法
- redis延時(shí)隊(duì)列zset實(shí)現(xiàn)的示例
- Redisson延時(shí)隊(duì)列RedissonDelayed的具體使用
- Redis簡(jiǎn)易延時(shí)隊(duì)列的實(shí)現(xiàn)示例
- Redis消息隊(duì)列、阻塞隊(duì)列、延時(shí)隊(duì)列的實(shí)現(xiàn)
- redis實(shí)現(xiàn)分布式延時(shí)隊(duì)列的示例代碼
- 生產(chǎn)redisson延時(shí)隊(duì)列不消費(fèi)問(wèn)題排查解決
- 基于Redis實(shí)現(xiàn)延時(shí)隊(duì)列的優(yōu)化方案小結(jié)
- redis實(shí)現(xiàn)延時(shí)隊(duì)列的兩種方式(小結(jié))
- Redis 延時(shí)隊(duì)列詳解
相關(guān)文章
Redis 設(shè)置密碼無(wú)效問(wèn)題解決
本文主要介紹了Redis 設(shè)置密碼無(wú)效問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Redis+PHP實(shí)現(xiàn)用戶(hù)消息推送每天最多通知2次的功能
在開(kāi)發(fā)應(yīng)用程序中,經(jīng)常需要向用戶(hù)推送消息通知,但是為了避免過(guò)多的打擾用戶(hù),我們希望限制每天最多通知2次,本篇博文將介紹如何使用PHP和Redis實(shí)現(xiàn)這一功能,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-10-10
詳解Redis中地理位置功能Geospatial的應(yīng)用
Geospatial?Indexes?是?Redis?提供的一種數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)和查詢(xún)地理位置信息,這篇文章就來(lái)和大家詳細(xì)講講Geospatial的具體應(yīng)用吧2023-06-06
Redis實(shí)現(xiàn)開(kāi)機(jī)自啟腳本(linux)
本段文字主要介紹了在Linux系統(tǒng)中通過(guò)創(chuàng)建啟動(dòng)腳本和修改配置文件來(lái)實(shí)現(xiàn)Redis服務(wù)的開(kāi)機(jī)自啟動(dòng),并強(qiáng)調(diào)了使用chkconfig命令的重要性,通過(guò)本文,讀者可以掌握Redis服務(wù)在Linux系統(tǒng)中的安裝與配置方法2026-06-06
Redis集群節(jié)點(diǎn)通信過(guò)程/原理流程分析
這篇文章主要介紹了Redis集群節(jié)點(diǎn)通信過(guò)程/原理,詳細(xì)介紹了Cluster(集群)的節(jié)點(diǎn)通信的流程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03

