redis用zset做延时消息
把执行时间作为分数,存到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做延时消息相关推荐
- rocktmq 消息延时清空_使用Kotlin+RocketMQ实现延时消息的示例代码
一. 延时消息 延时消息是指消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 使用延时消息的典型场景,例如: 在电商系统中,用户下完订单30分钟内没支付, ...
- go bson转换成json_你会不会用Go语言实现redis的延时消息队列
在学习过程中发现redis的zset还可以用来实现轻量级的延时消息队列功能,虽然可靠性还有待提高,但是对于一些对数据可靠性要求不那么高的功能要求完全可以实现.本次主要采用了redis中zset中的za ...
- 使用Redis Stream来做消息队列和在Asp.Net Core中的实现
Redis - Wikipedia 写在前面 我一直以来使用redis的时候,很多低烈度需求(并发要求不是很高)需要用到消息队列的时候,在项目本身已经使用了Redis的情况下都想直接用Redis来做消 ...
- rocketmq原理_消息中间件漫谈:RocketMQ延时消息应用及原理剖析
业务背景 延时任务是非常普遍的业务场景之一,即系统某一动作触发后,经过一定时间的延时后再触发其他一个或多个动作.以订单系统为例: 下单后10分钟未支付发送支付提醒 下单30分钟内未支付订单自动取消 业 ...
- java开发中常见的延时消息解决方案
前言 延时消息(定时消息)指的在分布式异步消息场景下,生产端发送一条消息,希望在指定延时或者指定时间点被消费端消费到,而不是立刻被消费. 延时消息适用的业务场景非常的广泛,在分布式系统环境下,延时消息 ...
- 延时消息常见实现方案
前言 延时消息(定时消息)指的在分布式异步消息场景下,生产端发送一条消息,希望在指定延时或者指定时间点被消费端消费到,而不是立刻被消费. 延时消息适用的业务场景非常的广泛,在分布式系统环境下,延时消息 ...
- 实现延时消息的6种方案
延时消息(定时消息)指的在分布式异步消息场景下,生产端发送一条消息,希望在指定延时或者指定时间点被消费端消费到,而不是立刻被消费. 延时消息适用的业务场景非常的广泛,在分布式系统环境下,延时消息的功能 ...
- Redis、Kafka 和 Pulsar 消息队列对比
点击关注公众号,Java干货及时送达 导语 | 市面上有非常多的消息中间件,rabbitMQ.kafka.rocketMQ.pulsar. redis等等,多得令人眼花缭乱.它们到底有什么异同,你应该 ...
- Redis、Kafka 和 Pulsar 消息队列对比,写得太好了!
市面上有非常多的消息中间件,rabbitMQ.kafka.rocketMQ.pulsar. redis等等,多得令人眼花缭乱.它们到底有什么异同,你应该选哪个? 本文尝试通过技术演进的方式,以redi ...
最新文章
- Science-2018-微生物群落的构建过程具有趋简性
- python抓取网页图片的小案例
- 基类指针调用派生类函数_C++ 多态性:虚函数--基类与派生类类型转换(第7章 05)例子问题解析(学习笔记:第8章 05)...
- 数据挖掘与数据化运营实战. 3.10 信用风险模型
- 滚动条插件nicescroll的使用
- 3 配置ftp文件服务器,03-FTP和TFTP配置
- Jquery Cookbook摘要之使用上下文参数
- 基于java+SpringBoot+HTML+Mysql社区管理系统(小区管理系统)
- 微信小程序模板订阅消息推送
- 梯度、散度、旋度的关系
- 前所未知的Bug(IDEA 和 金山词霸2016的冲突)
- I Love ces(大小写字母转换 金马五校赛-上海大学)
- python数据挖掘课后题答案_中国大学MOOC《数据挖掘与python实践》章节答案
- 【c#技术】一篇文章搞掂:水晶报表
- PythonC++相互混合调用编程全面实战-03ctypes类型对应
- 重修Java内功——书到用时方恨少
- Python中编码问题:u‘\xe6\x97\xa0\xe5\x90\x8d‘ 类型和 ‘\u559c\u6b22\u4e00\u4e2a\u4eba ’ 转为utf-8的解决办法
- Unity -- 按钮的使用
- VS2017 静态链接库(.lib)的制作和调用,并对环境配置进行试验
- python小波分析,频率普分析——代码修改