把执行时间作为分数,存到zset中。
定时任务,分数倒序取出第一个,小于当前时间,说明消息可以执行了

发送延时消息服务

public Object publishDelayedMsg() {OrderDTO dto = new OrderDTO();dto.setId(1);dto.setCreateTime(new Date());dto.setMoney("12.34");dto.setOrderNo("orderNo1");String s = JSON.toJSONString(dto);long executeTime = System.currentTimeMillis() + 60000L;ZSetOperations<String, String> zSetOperations = redisTemplate.opsForZSet();zSetOperations.add(RedisConstant.MQ_ZSET, s, executeTime);Long size = zSetOperations.size(RedisConstant.MQ_ZSET);Set<String> set = new HashSet<>();if (size != null && size > 0) {set = zSetOperations.range(RedisConstant.MQ_ZSET, 0, size - 1);}return set;}

controller

    //http://localhost:9040/redisZset/publishDelayedMsg@GetMapping("publishDelayedMsg")public Object publishDelayedMsg() {return redisService.publishDelayedMsg();}

消费消息服务

定时任务

    @TaskLock(RedisConstant.CONSUME_REDIS_ZSET_TASK)@Scheduled(cron = "0/10 * * * * ?")public void consumeMqZset() {redisService.consumeMqZset();}

消费消息

public void consumeMqZset() {ZSetOperations<String, String> zSetOperations = redisTemplate.opsForZSet();Set<ZSetOperations.TypedTuple<String>> typedTuples = zSetOperations.reverseRangeByScoreWithScores(RedisConstant.MQ_ZSET, 0, System.currentTimeMillis(), 0, 1);if (typedTuples == null || typedTuples.isEmpty()) {return;}ZSetOperations.TypedTuple<String> typedTuple = typedTuples.iterator().next();Double score = typedTuple.getScore();if (score == null) {return;}long l = score.longValue();if (l > System.currentTimeMillis()) {return;}String value = typedTuple.getValue();OrderDTO dto = JSON.parseObject(value, OrderDTO.class);System.out.println(dto);zSetOperations.remove(RedisConstant.MQ_ZSET, value);}

消费完消息后,删除消息

https://github.com/mingwulipo/cloud-demo.git

redis用zset做延时消息相关推荐

  1. rocktmq 消息延时清空_使用Kotlin+RocketMQ实现延时消息的示例代码

    一. 延时消息 延时消息是指消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 使用延时消息的典型场景,例如: 在电商系统中,用户下完订单30分钟内没支付, ...

  2. go bson转换成json_你会不会用Go语言实现redis的延时消息队列

    在学习过程中发现redis的zset还可以用来实现轻量级的延时消息队列功能,虽然可靠性还有待提高,但是对于一些对数据可靠性要求不那么高的功能要求完全可以实现.本次主要采用了redis中zset中的za ...

  3. 使用Redis Stream来做消息队列和在Asp.Net Core中的实现

    Redis - Wikipedia 写在前面 我一直以来使用redis的时候,很多低烈度需求(并发要求不是很高)需要用到消息队列的时候,在项目本身已经使用了Redis的情况下都想直接用Redis来做消 ...

  4. rocketmq原理_消息中间件漫谈:RocketMQ延时消息应用及原理剖析

    业务背景 延时任务是非常普遍的业务场景之一,即系统某一动作触发后,经过一定时间的延时后再触发其他一个或多个动作.以订单系统为例: 下单后10分钟未支付发送支付提醒 下单30分钟内未支付订单自动取消 业 ...

  5. java开发中常见的延时消息解决方案

    前言 延时消息(定时消息)指的在分布式异步消息场景下,生产端发送一条消息,希望在指定延时或者指定时间点被消费端消费到,而不是立刻被消费. 延时消息适用的业务场景非常的广泛,在分布式系统环境下,延时消息 ...

  6. 延时消息常见实现方案

    前言 延时消息(定时消息)指的在分布式异步消息场景下,生产端发送一条消息,希望在指定延时或者指定时间点被消费端消费到,而不是立刻被消费. 延时消息适用的业务场景非常的广泛,在分布式系统环境下,延时消息 ...

  7. 实现延时消息的6种方案

    延时消息(定时消息)指的在分布式异步消息场景下,生产端发送一条消息,希望在指定延时或者指定时间点被消费端消费到,而不是立刻被消费. 延时消息适用的业务场景非常的广泛,在分布式系统环境下,延时消息的功能 ...

  8. Redis、Kafka 和 Pulsar 消息队列对比

    点击关注公众号,Java干货及时送达 导语 | 市面上有非常多的消息中间件,rabbitMQ.kafka.rocketMQ.pulsar. redis等等,多得令人眼花缭乱.它们到底有什么异同,你应该 ...

  9. Redis、Kafka 和 Pulsar 消息队列对比,写得太好了!

    市面上有非常多的消息中间件,rabbitMQ.kafka.rocketMQ.pulsar. redis等等,多得令人眼花缭乱.它们到底有什么异同,你应该选哪个? 本文尝试通过技术演进的方式,以redi ...

最新文章

  1. Science-2018-微生物群落的构建过程具有趋简性
  2. python抓取网页图片的小案例
  3. 基类指针调用派生类函数_C++ 多态性:虚函数--基类与派生类类型转换(第7章 05)例子问题解析(学习笔记:第8章 05)...
  4. 数据挖掘与数据化运营实战. 3.10 信用风险模型
  5. 滚动条插件nicescroll的使用
  6. 3 配置ftp文件服务器,03-FTP和TFTP配置
  7. Jquery Cookbook摘要之使用上下文参数
  8. 基于java+SpringBoot+HTML+Mysql社区管理系统(小区管理系统)
  9. 微信小程序模板订阅消息推送
  10. 梯度、散度、旋度的关系
  11. 前所未知的Bug(IDEA 和 金山词霸2016的冲突)
  12. I Love ces(大小写字母转换 金马五校赛-上海大学)
  13. python数据挖掘课后题答案_中国大学MOOC《数据挖掘与python实践》章节答案
  14. 【c#技术】一篇文章搞掂:水晶报表
  15. PythonC++相互混合调用编程全面实战-03ctypes类型对应
  16. 重修Java内功——书到用时方恨少
  17. Python中编码问题:u‘\xe6\x97\xa0\xe5\x90\x8d‘ 类型和 ‘\u559c\u6b22\u4e00\u4e2a\u4eba ’ 转为utf-8的解决办法
  18. Unity -- 按钮的使用
  19. VS2017 静态链接库(.lib)的制作和调用,并对环境配置进行试验
  20. python小波分析,频率普分析——代码修改

热门文章

  1. 【王道考研计算机网络】—计算机网络的概念 组成 功能 分类
  2. 汽车车灯有必要改造成氙气大灯吗?
  3. 人类历史上有哪些逆天的文物?
  4. 郭麒麟、宋轶主演的《赘婿》1-8集拍得怎么样?
  5. 2021年是“三蛇闹春,十鼠抢粮,十一牛耕田”,啥意思?
  6. 社交电商为什么这么火
  7. 直播卖货到底是不是卖人设?
  8. 没人脉,没资源,没背景的人,最好的出路是什么?
  9. 为什么有些人电脑,电视,家电坏了首先是换新的,而不是维修?
  10. 大家一般用什么工具测试HTTP和json接口?