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

 更新时间:2024年11月22日 11:16:25   作者:尽兴-  
文章介绍了如何使用Redis实现一个简单的延时任务队列,通过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延时队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis模糊查询的几种实现方法

    Redis模糊查询的几种实现方法

    本文主要介绍了Redis模糊查询的几种实现方法,包括两种方法KEYS , SCAN,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 一篇文章带你弄清楚Redis的精髓

    一篇文章带你弄清楚Redis的精髓

    Redis是一个开源的、支持网络、基于内存的键值对存储系统,它可以用作数据库、缓存和消息中间件。它支持多种数据类型,包括字符串、散列、列表、集合、位图等,拥有极快的读写速度,并且支持丰富的特性,如事务、持久化、复制、脚本、发布/订阅等。
    2023-02-02
  • Redis key的过期时间和永久有效的实现

    Redis key的过期时间和永久有效的实现

    在Redis中,键可以设置过期时间或被永久保存,`EXPIRE`和`PEXPIRE`命令分别用于设置键的过期时间,具有一定的参考价值,感兴趣的可以了解一下
    2024-09-09
  • 详解redis在服务器linux下启动的相关命令(安装和配置)

    详解redis在服务器linux下启动的相关命令(安装和配置)

    这篇文章主要介绍了redis在服务器linux下的启动的相关命令(安装和配置),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 基于Redis的分布式锁及原子性问题(短视频开发)

    基于Redis的分布式锁及原子性问题(短视频开发)

    短视频开发中,Redis分布式锁通过SETNX实现加锁与解锁,需设置超时时间避免死锁,为防止误删,释放锁时需判断线程身份,并用Lua脚本保证原子性,确保安全操作,本文给大家介绍基于Redis的分布式锁及原子性问题,感兴趣的朋友一起看看吧
    2025-06-06
  • 利用Redis实现访问次数限流的方法详解

    利用Redis实现访问次数限流的方法详解

    这篇文章主要给大家介绍了关于如何利用Redis实现访问次数限流的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • Redis动态热点数据缓存策略设计

    Redis动态热点数据缓存策略设计

    本文主要介绍了Redis动态热点数据缓存策略设计,包括热点数据识别、动态缓存、多级缓存、预加载机制、更新策略以及监控告警等,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • Spring Boot 3.0x的Redis 分布式锁的概念和原理

    Spring Boot 3.0x的Redis 分布式锁的概念和原理

    Redis 分布式锁是一种基于 Redis 的分布式锁解决方案,它的原理是利用 Redis 的原子性操作实现锁的获取和释放,从而保证共享资源的独占性,这篇文章主要介绍了适合 Spring Boot 3.0x的Redis 分布式锁,需要的朋友可以参考下
    2024-08-08
  • redis快照模式_动力节点Java学院整理

    redis快照模式_动力节点Java学院整理

    这篇文章主要为大家详细介绍了redis快照模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 详解Redis 分布式锁遇到的序列化问题

    详解Redis 分布式锁遇到的序列化问题

    这篇文章主要介绍了Redis 分布式锁遇到的序列化问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论