redis延时队列的项目实践

 更新时间:2024年11月22日 08:28:53   作者:从int开始  
本文主要介绍了redis延时队列的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

引入

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

放入延时队列

  import org.redisson.api.RedissonClient;
  
  @Autowired
  private RedissonClient redissonClient;
  public static final String CardKitMessageDelayQueue = "QUEUE:CARD_KIT";

      // 发送延时消息
      RBlockingDeque<CardKitRedisBo> blockingDeque = redissonClient
              .getBlockingDeque(CardKitMessageDelayQueue);
      RDelayedQueue<CardKitRedisBo> delayedQueue = redissonClient.getDelayedQueue(blockingDeque);
      // 计算时间戳
      long delayInSeconds = calculateDifference(model.getSendTime(), LocalDateTime.now());
      CardKitRedisBo cardKitRedisBo = new CardKitRedisBo();
      cardKitRedisBo.setId(model.getId()).setTemplateId(model.getTemplateId());
      delayedQueue.offer(cardKitRedisBo, delayInSeconds, TimeUnit.SECONDS);

监听延时队列

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) {
        // 获取定时任务锁
        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("获取延时消息:{}", JSONUtil.toJsonStr(poll));
              // 消费消息
              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();
  }
}

到此这篇关于redis延时队列的文章就介绍到这了,更多相关redis延时队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Redis如何使用lua脚本实例教程

    Redis如何使用lua脚本实例教程

    这篇文章主要给大家介绍了关于Redis如何使用lua脚本的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • redis数据结构之压缩列表

    redis数据结构之压缩列表

    这篇文章主要介绍了redis数据结构之压缩列表,压缩列表是列表list和hash数据结构的底层实现之一,是redis为了节约内存而开发的,由一系列特殊编码的连续内存块组成的顺序型数据结构,下面详细内容需要的小伙伴可以参考一下
    2022-03-03
  • CentOS Linux系统下安装Redis过程和配置参数说明

    CentOS Linux系统下安装Redis过程和配置参数说明

    这篇文章主要介绍了CentOS Linux系统下安装Redis过程和配置参数说明,需要的朋友可以参考下
    2014-10-10
  • redis启动,停止,及端口占用处理方法

    redis启动,停止,及端口占用处理方法

    今天小编就为大家分享一篇redis启动,停止,及端口占用处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 搭建Redis服务器步骤详细介绍

    搭建Redis服务器步骤详细介绍

    大家好,本篇文章主要讲的是搭建Redis服务器步骤详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Redis中渐进式遍历Scan命令的使用

    Redis中渐进式遍历Scan命令的使用

    在Redis中,一般都会禁用keys 这种命令,因为它会遍历整个数据库,会严重影响redis的性能,本文就来介绍一下Redis中渐进式遍历Scan命令的使用,感兴趣的可以了解一下
    2023-11-11
  • Redis存取序列化与反序列化性能问题详解

    Redis存取序列化与反序列化性能问题详解

    这篇文章主要给大家介绍了关于Redis存取序列化与反序列化性能问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 使用Redis实现微信步数排行榜功能

    使用Redis实现微信步数排行榜功能

    这篇文章主要介绍了使用Redis实现微信步数排行榜功能,本文通过图文实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • redis实现存储帖子的点赞状态和数量的示例代码

    redis实现存储帖子的点赞状态和数量的示例代码

    使用Redis来实现点赞功能是一种高效的选择,因为Redis是一个内存数据库,适用于处理高并发的数据操作,这篇文章主要介绍了redis实现存储帖子的点赞状态和数量的示例代码,需要的朋友可以参考下
    2023-09-09
  • Redis+Caffeine两级缓存的实现

    Redis+Caffeine两级缓存的实现

    本文主要介绍了Redis+Caffeine两级缓存的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论