怎么使用redis实现一个延时队列
一个工作了6年的粉丝,去应聘一个年薪40W的工作,在第一面被问到这个问题。
你知道怎么实现吗?
问题解析
要回答这个问题,首先的明白什么是延时队列。
其次,还得了解Redis里面哪些结构可以支持这个特性。
延时队列是一种特殊类型的消息队列,它允许把消息发送到队列中,但不立即投递给消费者,而是在一定时间后再将消息投递给消费者。
所以它通常用于需要在未来某个时间执行任务的场景,比如订单的超时处理、定时任务等。
下面来看一下这个问题的回答。
问题答案
在Redis里面可以使用Zset这个有序集合来实现延时队列。
具体的实现方式可以分成几个步骤。
-
使用ZADD命令把消息添加到sorted set中,并将当前时间作为score(分数)
ZADD delay-queue <timestamp> <message>
-
启动一个消费者线程,使用ZRANGEBYSCORE命令获取定时从Zset中获取当前时间之前的所有消息
ZRANGEBYSCORE delay-queue 0 <current_time> WITHSCORES LIMIT 0 <batch_size>
-
消费者处理完消息后,可以从有序集合中删除这些消息。
ZREMRANGEBYSCORE delay-queue 0 <current_time>
这种方式实现的延迟队列,消费端需要不断的向Redis发起轮训,所以它会存在两个问题:
-
轮训存在时间间隔,所以延时消息的实际消费时间会大于设定的时间
-
大量轮训会对Redis服务器造成压力
总结
大家知道怎么回答了吗?
如果你喜欢我的作品,记得点赞收藏加关注哦!!!
另外,我将所有Java面试系列制作成了完整的面试文档。它的便捷之处在于,可以通过检索的方式,找到你想要的面试题,目前已经更新300期,总计超过30W字!