redis实现延时消息队列,redisson延迟队列,redis实现延时队列的两种方式(小结)

redis实现延时消息队列,redisson延迟队列,redis实现延时队列的两种方式(小结)

摘要:本文主要介绍了redis实现延迟队列的两种方法(总结),并通过示例代码进行了详细介绍,对大家的学习或工作有一定的参考价值。下面让我们跟随边肖一起学习。

背景

项目的过程监控有几种节点,需要监控每个节点是否超时。按照传统的做法,肯定是通过定时任务,扫描然后判断,但是定时任务有缺点:1、数据量会比较慢;2,时间不好控制,太短了,怕一次完不了,太长了会有延迟。所以我想到了用延迟队列来实现。

一是redis的过期重点监控

1.打开过期密钥监控。

从redis配置中删除此注释。

通知-密钥空间-事件Ex

然后重启redis。

2.利用redis过期监听实现延迟队列

继承keyepirationeventmessagelistener类并实现父类的方法,可以监视密钥过期时间。当一个密钥过期时,它将在这里执行。在这里,过滤出需要的键,发送到kafka队列。

@组件

@Slf4j

公共类RedisKeyExpirationListener扩展keyepirationeventmessagelistener {

@自动连线

私立KafkaProducerService;

public rediskeexpirationlistener(RedisMessageListenerContainer listenerContainer){

super(listener container);

}

/**

*对redis数据失败事件的数据处理。

* @param消息

* @param模式

*/

@覆盖

public void on Message(Message Message,byte[] pattern){

if(message==null | | string utils . isempty(message . tostring())){

返回;

}

字符串内容=message . tostring();

//key的格式为flag: aging type:运单号示例如下

尝试{

if(content . starts with(ABN constant。EMS)){

kafkaproducerservice . sendmessage sync(topic constant。EMS _运单_ ABN _队列,内容);

} else if(content . starts with(ABN constant。韵达)){

kafkaproducerservice . sendmessage sync(topic constant。韵达_运单_ ABN _队列,内容);

}

} catch(异常e) {

Log.error('监控过期密钥,发送kafka异常,',e);

}

}

}

可以看到,这个方法其实很简单,但是有几个问题需要注意。首先,尽量在单台机器上运行这个,因为多台机器会执行它,浪费cpu,增加数据库的负担。第二,机器频繁部署时,如果有时间间隔,会有数据泄露处理。

其次,redis zset实现了延迟队列

1、生产者实现

可以看出制作人很简单,其实就是利用zset的特性给一个zset添加元素,时间就是它的分数。

public void produce(Integer taskId,long exeTime) {

system . out . println(' Join the task,taskid:' taskid ',exercise:' exercise ',当前时间:' local datetime . now());

RedisOps.getJedis()。zadd(RedisOps.key,exeTime,string . value of(taskId));

}

2、消费者变现

消费者代码并不难,就是删除过期的zset中的元素,然后处理数据。

公共void消费者(){

executors . newsinglethreadexecutor()。提交(新的Runnable() {

@覆盖

公共无效运行(){

while (true) {

SetString taskIdSet=redis ops . get jedis()。zrangeByScore(RedisOps.key,0,System.currentTimeMillis(),0,1);

if(taskIdSet==null | | taskIdSet . isempty()){

System.out.println(“无任务”);

}否则{

taskIdSet.forEach(id - {

long result=RedisOps.getJedis()。zrem(RedisOps.key,id);

if(结果==1L) {

System.out.println('从延迟队列中获取任务,taskId:' id ',当前时间:' local datetime . now());

}

});

}

尝试{

时间单位。毫秒睡眠(100);

} catch (InterruptedException e) {

e . printstacktrace();

}

}

}

});

}

可以看出,这种方法其实比上一种更好。因为他的两个缺点都克服了。多机也行,不用担心部署时间间隔长。

摘要

两种方法都不错,都能解决问题。遇到问题,多思考,多总结。

这就是本文关于实现redis延迟队列的两种方法(总结)。更多相关redis延迟队列内容,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 关于redis数据库入门详细介绍图片,redis数据库的使用,关于Redis数据库入门详细介绍
  • redis队列操作命令,redis 循环队列
  • redis队列操作命令,redis 循环队列,redis实现简单队列
  • redis部署应用服务器上,redis如何启动服务器
  • redis部署应用服务器上,redis如何启动服务器,搭建Redis服务器步骤详细介绍
  • redis缓存穿透和击穿解决方案,redis缓存穿透,缓存雪崩解决
  • redis缓存穿透和击穿解决方案,redis缓存穿透,缓存雪崩解决,redis缓存穿透解决方法
  • Redis缓存,redis和缓存
  • Redis缓存,redis和缓存,Redis缓存详解
  • redis的配置,启动,操作和关闭方法有哪些,关闭redis的命令,Redis的配置、启动、操作和关闭方法
  • redis的主从配置方法详解图,Redis主从配置
  • redis的主从配置方法详解图,Redis主从配置,redis的主从配置方法详解
  • redis界面工具,mac安装redis可视化工具
  • redis界面工具,mac安装redis可视化工具,推荐几款 Redis 可视化工具(太厉害了)
  • redis正确使用的十个技巧是什么,redis正确使用的十个技巧有哪些
  • 留言与评论(共有 条评论)
       
    验证码: