首页 > 数据库 >redis实现延时队列(附完整代码)

redis实现延时队列(附完整代码)

时间:2024-01-20 22:01:02浏览次数:43  
标签:iterator 队列 redis System value score 延时 QUEUENAME


最近在复习所学过的队列的知识,像什么LinkedBlockingDeque。ArrayBlockingQueue,还有ribbitmq里的乱七八糟的,其本质我感觉啊这些技术就是一些队列,只不过大体上分为单机队列和分布式队列而已,当然本文的重点在于redis实现延时队列啊,可能有人会说,用ribbitmq这个专门的消息中间件实现延时队列不香么,给消息设置个ttl,失效了放入死信队列进行监听,不就行了吗。可是面试的时候或者有些公司就是不想用消息中间件,你难不成还去劝说老总吗?显然这不现实,我们要做的就是尽量能多学点就多学点吧,保不齐以后就有这么刻薄的需求要我们来实现呢。

思路

先介绍下redis的5大数据类型吧,string hash set sortset list,其中与本文有关的就是sortset,大白话来说就是sortset可以进行排序,可以进行排序就意味这是不是与队列搭边了。其实大体上的思路就是存数据时以时间戳为排序规则存入,取数据时:当前时间戳>存入数据的时间戳则消费。

生产者实现

实际开发中可以根据需求封装一个vo类作为消息存入redis,我这里直接简单写了把i作为value存入QUEUENAME集合中,设置scroe为(当前时间+i分钟)的时间戳

@Autowired
    RedisTemplate redisTemplate;
    String QUEUENAME = "zzh:queue";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	@Test
    public void pr() {
        for (int i = 1; i <= 1; i++) {
            Calendar now = Calendar.getInstance();
            now.setTime(new Date());
            now.set(Calendar.MINUTE, now.get(Calendar.MINUTE) + i);
            System.out.println("生产了:" + i + "当前时间为:" + simpleDateFormat.format(System.currentTimeMillis()) + "消费时间为:" + simpleDateFormat.format(now.getTime()));
            //往QUEUENAME这个集合中放入i,设置scorce为排序规则
            redisTemplate.opsForZSet().add(QUEUENAME, i, now.getTime().getTime());
        }

    }

消费者实现

拿出score范围在0-当前时间戳的每条数据,遍历比较是否时间戳<当前时间戳,如果小于表示没有到达可以消费的时间,直至>了才可以消费

/**
     * @param
     * @method 每间隔1秒执行一次
     */
    @Scheduled(cron = "*/1 * * * * * ")
    public void cs() {
        System.out.println("------------等待消费--------------");
        //取出QUEUENAME集合中的score在0-当前时间戳这个范围的所有值
        Set<Integer> set = redisTemplate.opsForZSet().rangeByScore(QUEUENAME, 0, System.currentTimeMillis());
        Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()) {
            Integer value = iterator.next();
            //遍历取出每一个score
            Double score = redisTemplate.opsForZSet().score(QUEUENAME, value);
            //达到了时间就进行消费
            if (System.currentTimeMillis() > score) {
                System.out.println("消费了:" + value + "消费时间为:" + simpleDateFormat.format(System.currentTimeMillis()));
                redisTemplate.opsForZSet().remove(QUEUENAME, value);

            }
        }


    }

测试

可以看到只有达到时间才进行消费

redis实现延时队列(附完整代码)_队列


redis实现延时队列(附完整代码)_rabbitmq_02

完整代码链接

觉得不错的点个小星星吧
https://github.com/zhangzihang3/DelayQueue.git


标签:iterator,队列,redis,System,value,score,延时,QUEUENAME
From: https://blog.51cto.com/u_16414043/9346338

相关文章

  • 编译安装Redis
    编译安装Redisubuntu22.04.31.下载redis源码包redis官网下载最新的稳定版本。(7.2)2.编译安装将redis.tar.gz解压到linxu下的/usr/local/src下,用make命令编译。需要一下依赖pkg-configgcc如果报错缺失cc和pkg-config,则需要安装对应的依赖sudoapt-getinst......
  • Redis数据类型
    title:Redis数据类型date:2024-01-2017:01:46permalink:/pages/73a3c3/categories:-中间件-Redistags:-Redis数据类型Redis作为K-V类型的缓存中间件,其value一共有5中数据类型。string,set,list,sorted-set(zset),hash.数据类型查看方式可以通......
  • Redis之Lua脚本讲解
    目录1Lua1.1简介1.1.1注释1.1.2变量1.1.3数据类型1.1.4控制结构1.1.5函数1.1.6模块1.1.7字符串操作1.1.8错误处理1.1.9标准库1.2Redis和Lua脚本结合优点1.3Lua脚本应用和调试1.3.1缓存更新1.3.2原子操作1.3.3数据处理1.3.4分布式锁1.3.5Redis中调试Lua1.4Lua脚......
  • 【数据结构】详谈队列的顺序存储及C语言实现
    循环队列及其基本操作的C语言实现前言大家好,很高兴又和大家见面啦!!!在上一篇内容中,我们在介绍完队列的基本概念、重要术语以及基本操作后,又回顾了一下数据结构的三要素——数据的逻辑结构、数据的存储结构以及数据的运算。队列这种数据结构我们已经介绍了它的逻辑结构以及数据运算......
  • redis漏洞修复-使用redis普通用户启动redis服务程序(禁止root用户权限)
    2.Redis服务以root权限运行应用:Redis危险程度:高危风险描述:Redis服务以root权限运行,攻击者可通过Redis对服务器文件进行任意操作或者执行命令。通过查询命令获取敏感信息,通过写入公钥信息获取ssh登录权限等。如果Redis为root权限,攻击者则无需提权直接对服务器进行操作。验证信息......
  • Redis篇-redis使用场景-缓存-缓存击穿-03
    1缓存击穿缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮。1.1解决方案一:互斥锁1.2解决方案二:逻辑过期总结:缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有......
  • 这才是你应该了解的Redis数据结构!
    深入了解Redis数据结构Redis,作为一种高性能的内存数据库,支持多种数据结构,从简单的字符串到复杂的哈希表。在这篇博文中,我们将深入探讨Redis的一些主要数据结构,并通过详细的例子展示它们的使用。1.字符串(String)1.1存储和获取Redis中的字符串是二进制安全的,可以存储任何数......
  • Redis篇-redis使用场景-缓存-缓存穿透-02
    问题一:项目中哪些场景使用了redis呢?1缓存穿透缓存穿透:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库。1.1解决方案一方案一:缓存空数据,查询返回的数据为空,仍把这个空结果进行缓存;{key:1,value:null}优点:简单;缺点:消耗内存,可能会发......
  • openEuler欧拉部署Redis
    一、系统优化关闭防火墙systemctlstopfirewalldsystemctldisablefirewalld关闭selinuxsed-ri's/SELINUX=enforcing/SELINUX=disabled/'/etc/selinux/configsetenforce0二、安装Redisdnf-yinstallredisvim/etc/redis.conf#bind127.0.0.1bind0.0.0.0protected-mo......
  • redis实战 pdf 下载
    《redis实战》深入浅出地介绍了Redis的5种数据类型,并通过多个实用示例展示了Redis的用法。除此之外,书中还讲述了Redis的优化方法以及扩展方法,是一本对于学习和使用Redis来说不可多得的参考书籍。《redis实战》一共由三个部分组成。部分对Redis进行了介绍,说明了Redis的基本使用......