首页 > 数据库 >软考高级之redis中使用zset实现延迟队列,你答对了么?

软考高级之redis中使用zset实现延迟队列,你答对了么?

时间:2024-05-26 09:32:36浏览次数:24  
标签:zset 软考 redis System currentTimeMillis 任务 jedis delayOrderQueue

实现延迟队列的思路

zset的特性,带有分数的排序,以时间戳作为分数进行排序

  1. 添加任务 zdd
  2. 取出任务 zrangbyscore
  3. 执行任务 zrem

定时任务

  public static void main(String[] args) {
        Jedis jedis = new Jedis("ip", 6379);
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                // 这里是定时任务的执行代码
                Set<String> order = jedis.zrangeByScore("delayOrderQueue", System.currentTimeMillis()-10000, System.currentTimeMillis());
                //取出任务进行执行
                for (String orderId : order) {
                    Long order1 = jedis.zrem("delayOrderQueue", orderId);
                    System.out.println("执行任务:" +  orderId);
                }
            }
        };
        Timer timer = new Timer();
        long delay = 0; // 延迟开始执行时间,单位:毫秒
        long period = 1000; // 定时任务执行间隔,单位:毫秒
        timer.scheduleAtFixedRate(task,delay,period);
    }

添加任务

/**
     * zset实现实现延迟队列
     */
    @Test
    public void TestZet(){
        long currentTimeMillis = System.currentTimeMillis();
        System.out.println(currentTimeMillis);
        jedis.zadd("delayOrderQueue", currentTimeMillis, "1");
        jedis.zadd("delayOrderQueue", currentTimeMillis+3000, "2");
        jedis.zadd("delayOrderQueue", currentTimeMillis+5000, "3");
    }

<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="YysiJtSb-1716686383697" src="https://player.bilibili.com/player.html?aid=1405052598"></iframe>

软考高级之redis中使用zset实现延迟队列,你答对了么?

标签:zset,软考,redis,System,currentTimeMillis,任务,jedis,delayOrderQueue
From: https://blog.csdn.net/qq_37400096/article/details/139207744

相关文章

  • 学习redis问题记录
    2024年5月25日倒腾了很长时间突然发现的问题ide提示改为toList()我顺便就改过去了但是实际业务中redis序列化会产生无法反序列化的问题造成缓存挂壁业务直接Gcollect(Collectors.toList())不能缩写为.toList()序列化会炸问题解析:这个问题其实跟代码本身没有直接......
  • Redis基本数据结构
    String数据结构如果存储的是整型,直接把值存储在RedisObject里面,数据类型为int。如果存储的数据量不大(早期版本,32字节),采用动态字符串SDS存储,存储类型是embstr。超过32字节,采用动态字符串SDS进行存储,存储类型是raw。embstr和raw类型的区别在于,RedisObject和embstr是连续存......
  • 企业生产环境中的麒麟V10(ARM架构)操作系统部署jdk和redis三主三从交叉版集群
    前言:麒麟ARM操作系统是国企和政务机关推行信创化选择率比较高的一款操作系统,然而ARM操作系统非主流的X86系统,除了命令一样,在架构方面差别极大,初次接触多多少少会踩坑,下面我将在公司中部署的实例列举出来,供大家参考,ip和设计机密信息不方便展示,统用虚拟信息代替。经过多次验证,用了......
  • go go-redis 使用lua保证操作的原子性
      Redis是应对高并发的常用工具,在常用缓存技巧中讲过相关技巧。但有些业务场景,使用Redis会遇到问题,如电商里的秒杀、扣减库存等。拿减库存举例,一般需要两步:先扣减库存,获取扣减后的库存值V如果V小于0,说明库存不够,需要将扣减的值再加回去;如果V大于等于0,则执行后续操作......
  • Redis 源码学习记录:集合 (set)
    无序集合Redis源码版本:Redis-6.0.9,本篇文章无序集合的代码均在intset.h/intset.c文件中。Redis通常使用字典结构保存用户集合数据,字典键存储集合元素,字典值为空。如果一个集合全是整数,则使用字典国语浪费内存。为此,Redis设计了intset数据结构,专门用来保存整数......
  • Redis常问八股
    1.sortedSet底层sortedset中的每一个元素都带有一个score属性可以基于score属性对元素进行排序,底层的实现是一个跳表加hash表。可排序元素不重复查询速度快2.NoSQL和SQLSQL1对数据的格式有严格的约定Table必须定义每个属性的数据格式每个Table必须含有主键只能存储Tab......
  • Redis Stream消息队列
    工具类部分内容packagecom.hwd.campus.common.redis.utils;importcom.hwd.campus.common.redis.constant.RedisKeyPrefixConst;importcom.hwd.campus.common.redis.service.RedisListSelect;importcom.hwd.campus.common.redis.service.RedisSelect;importlombok.AllA......
  • Redis 高阶应用
    生成全局唯一ID全局唯一ID需要满足以下要求:唯一性:在分布式环境中,要全局唯一高可用:在高并发情况下保证可用性高性能:在高并发情况下生成ID的速度必须要快,不能花费太长时间递增性:要确保整体递增的,以便于数据库创建索引安全性:ID的规律性不能太明显,以免信息泄露从上面的......
  • 面试问 Redis 的字符串原理是什么?答不出被 Pass 了!
    引言:在Redis中,并没有使用C标准库提供提供的字符串,而是实现了一种动态字符串,即SDS(SimpleDynamicString),然后通过这种数据结构来表示字符串,面试中除了基本数据类型让你去讲解,此外还会讲1-2种数据结构的底层原理和优势。题目redis的字符串为什么要升级SDS,而不用C......
  • redis自学(44)多级缓存
              就是把注释全都删了  这里指的是OpenResty的Nginx配置文件   请求参数处理    先修改Nginx配置文件 修改lua文件,然后重启nginx   查询Tomcat   写lua文件做工具类      ......