当前位置: 首页 > news >正文

石家庄网站建设推广服务零起飞网站建设工作室

石家庄网站建设推广服务,零起飞网站建设工作室,湖北seo关键词排名优化软件,怎么在网站做谷歌广告使用Redis模拟延时队列 实际上通过MQ实现延时队列更加方便,只是在实际业务中种种原因导致最终选择使用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的有序集合和简单的定时器,能够实现一个简洁有效的延时任务队列。
当然,这个示例是一个简化的模型,在生产环境中,你需要考虑任务的幂等性、系统崩溃后的恢复策略、任务的优先级等问题。希望本文能为你提供实现延时队列的思路和参考。

http://www.yayakq.cn/news/304070/

相关文章:

  • 沧州网站建设刘磊绍兴企业网站推广
  • 创建一个购物网站自动售货机免费投放联系方式
  • 网站建设管理报告济南建设企业网站
  • 敦化市建设局网站十大国外室内设计网站
  • 微网站建设对微网站进行策划贵州网站开发哪家便宜
  • 潍坊一品网站制作免费招聘网站都有哪些
  • 做土豆的视频在线观看网站做短视频的网站都有哪些
  • 做网站怎么报价菜谱网站模版
  • 个人建站建设优化推广服务商
  • 网站正在建设中页面 英文宁波信息港
  • 昆明网站搭建seo关键词排名优化品牌
  • 什么软件可以做动画视频网站公司网站数据库表设计
  • 做养生网站怎么赚钱直接网址登录wordpress
  • 网站开发设计需求域名跳转网站
  • 站内seo优化建设网站需要什么硬件
  • wordpress网站搬家推介网
  • 乐清新闻综合频道节目表优化方案答案
  • 做公司网站多少钱怎么创作一个软件
  • 网站开发语言html5 php服装品牌网站开发php
  • 网站升级中 html包头土右旗建设局网站
  • 建网站好还是开天猫好微信小程序ui设计
  • 深圳的设计网站大全盘锦网站建设 盘锦建站推广 盘锦建站
  • 电子商务网站建设含义多少网站域名采用中文
  • 手表大全网站专门做水果的网站
  • 网站风格设计原则网站招聘方案怎么做
  • 版纳网站建设河池城乡住房和建设局网站
  • 电商购物网站模板wordpress文章摘要显示
  • 网站链接如何做二维码用户注册网站开发
  • 黄江网站建设关于wordpress自动更新
  • 做一款推荐类的网站做网站颜色如何搭配