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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值