当前位置: 代码网 > it编程>数据库>Redis > Redis模拟延时队列实现日程提醒的方法

Redis模拟延时队列实现日程提醒的方法

2024年11月25日 Redis 我要评论
使用redis模拟延时队列实际上通过mq实现延时队列更加方便,只是在实际业务中种种原因导致最终选择使用redis作为该业务实现的中间件,顺便记录一下。该业务是用于日程短信提醒,用户添加日程后,就会被放

使用redis模拟延时队列

实际上通过mq实现延时队列更加方便,只是在实际业务中种种原因导致最终选择使用redis作为该业务实现的中间件,顺便记录一下。
该业务是用于日程短信提醒,用户添加日程后,就会被放入redis队列中等待被执行发送短信提醒业务。
本文介绍如何使用redis来实现一个简单的延时任务队列,通过这个示例,可以帮助你理解如何利用redis的有序集合特性来管理和执行延时任务。

设计思路

redis有序集合(sorted set)可以很好地用来实现延时队列的功能。通过将任务的执行时间作为分数(score)来存入有序集合中,并定期检查集合中小于等于当前时间的任务来触发执行。

代码实现

jediscluster连接初始化

首先,我们需要初始化jediscluster连接来与redis集群进行交互。

private static final string zset_key = "sms_delayed_tasks";
private jediscluster jediscluster;
public void redisclusterscheduler() {
    set<hostandport> nodes = new hashset<>();
    //从配置文件中读取redis集群配置
    for (string node : acpcore.getprop("spring.redis.cluster.nodes").split(",")) {
        string[] hostport = node.split(":");
        nodes.add(new hostandport(hostport[0], integer.parseint(hostport[1])));
    }
    genericobjectpoolconfig<jedis> poolconfig = new genericobjectpoolconfig<>();
    poolconfig.setmaxtotal(128);
    poolconfig.setmaxidle(128);
    poolconfig.setminidle(16);
    jediscluster = new jediscluster(nodes, 2000, 2000, 5, acpcore.getprop("spring.redis.password"), poolconfig);
    if (!iscalled) {
        iscalled = true;
        starttaskchecker();
    }
}

添加延时任务

我们可以通过指定任务和执行时间来添加延时任务。该方法将执行时间转换为时间戳,并将任务存储在redis有序集合中。

public void adddelayedtask(string task, string time) {
    long executetime = converttotimestamp(time);
    if (executetime > system.currenttimemillis() / 1000) {
        jediscluster.zadd(zset_key, executetime, task);
        log.info("添加任务: " + task + " 执行时间: " + executetime);
    } else {
        log.info("任务时间必须在当前时间之后: " + task);
    }
}
private long converttotimestamp(string time) {
    simpledateformat sdf = new simpledateformat("yyyy-mm-dd hh:mm:ss");
    try {
        return sdf.parse(time).gettime() / 1000;
    } catch (parseexception e) {
        e.printstacktrace();
        return system.currenttimemillis() / 1000;
    }
}

检查和执行任务

通过一个定时任务不断检查当前时间之前的任务并执行。

private void starttaskchecker() {
    executorservice.submit(() -> {
        while (!thread.currentthread().isinterrupted()) {
            try {
                checkandexecutetasks();
                thread.sleep(1000);
            } catch (exception e) {
                log.info(new date() + "发生异常但不中断,异常是:" + e);
            }
        }
    });
}
private void checkandexecutetasks() {
    long currenttime = system.currenttimemillis() / 1000;
    set<string> tasks = jediscluster.zrangebyscore(zset_key, 0, currenttime);
    for (string task : tasks) {
        jediscluster.zrem(zset_key, task);
        executetask(task);
    }
}

执行任务的逻辑

假设任务内容是一个json对象,执行逻辑在这里可以是任何操作,比如调用外部服务、发送消息等。

private void executetask(string taskjson) {
    jsonobject task = jsonobject.parseobject(taskjson);
    // 在此处添加具体的业务逻辑
    log.info("执行任务: " + task);
}

总结

通过redis的有序集合和简单的定时器,能够实现一个简洁有效的延时任务队列。
当然,这个示例是一个简化的模型,在生产环境中,你需要考虑任务的幂等性、系统崩溃后的恢复策略、任务的优先级等问题。希望本文能为你提供实现延时队列的思路和参考。

到此这篇关于redis模拟延时队列 实现日程提醒的文章就介绍到这了,更多相关redis延时队列内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • Redis数据一致性详解

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

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

    为Redis设置密码的三种方法

    前言redis 是一个高性能的键值对数据库,广泛应用于缓存、消息队列等场景。为了保障 redis 服务的安全性,设置密码认证是非常重要的一步。方法一:通过编辑配... [阅读全文]
  • RedisTemplate序列化设置的流程和具体步骤

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

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

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

    2024年11月13日 数据库
  • Redis高并发缓存设计问题与性能优化

    1、缓存设计典型问题1.1、缓存穿透缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,通常出于容错的考虑,如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的…

    2024年11月12日 数据库
  • Nginx实现TCP端口的侦听及转发操作步骤

    Nginx实现TCP端口的侦听及转发操作步骤

    一、说明由于我们在使用mqtt时,会接收大量的客户端连接,单机的mqtt肯定是扛不住的,所以需要一个mqtt的集群来处理,这时就得有一个网关来负责请求的转发ng... [阅读全文]

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

发表评论

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