当前位置: 代码网 > it编程>数据库>Redis > redis延时队列的项目实践

redis延时队列的项目实践

2024年11月25日 Redis 我要评论
引入<redisson.version>3.15.5</redisson.version> <dependency> <groupid>

引入

<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延时队列内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

  • Redis数据一致性详解

    1、一致性一致性是指系统中各节点数据保持一致。分布式系统中,可以理解为多个节点中的数据是一致的。一致性根据严苛程度分类:强一致性:写进去的数据是什么,读出来的数据就是什么,对性能影…

    2024年11月15日 数据库
  • 为Redis设置密码的三种方法

    为Redis设置密码的三种方法

    前言redis 是一个高性能的键值对数据库,广泛应用于缓存、消息队列等场景。为了保障 redis 服务的安全性,设置密码认证是非常重要的一步。方法一:通过编辑配... [阅读全文]
  • 使用Redis实现数据库对象自增ID的方法

    使用Redis实现数据库对象自增ID的方法

    在分布式项目中,数据表的主键id一般可能存在于uuid或自增id这两种形式,uuid好理解而且实现起来也最容易,但是缺点就是数据表中的主键id是32位的字符串,... [阅读全文]
  • RedisTemplate序列化设置的流程和具体步骤

    RedisTemplate序列化设置的流程和具体步骤

    流程概述下面是整个 redistemplate 序列化设置的流程图:具体步骤1. 创建 redistemplate 实例首先,我们需要创建一个 redistem... [阅读全文]
  • 基于Redis实现API接口访问次数限制

    一,概述日常开发中会有一个常见的需求,需要限制接口在单位时间内的访问次数,比如说某个免费的接口限制单个ip一分钟内只能访问5次。该怎么实现呢,通常大家都会想到用redis,确实通过…

    2024年11月13日 数据库
  • Redis主从复制的实现示例

    Redis主从复制的实现示例

    redis 主从复制主从复制是高可用redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com