首先明确 Redis 的队列并非高可靠的,可能存在消息丢失等问题;
    队列是一个 FIFO 的结构,Redis 中可以使用 List 列表( lpush 与 lpop 或者 rpush 与 rpop ) 来实现先进先出;但是即使列表中元素为0, pop 操作依旧会执行,这会导致队列为空时无端的消耗,我们可以考虑在消费端加上休眠方法,如果取出值为空则休眠;
    需要注意的是休眠的时间值不好界定,设置大了吞吐量就大受影响,更优的方法是我们可以使用 blpop 或者 brpop 来取出列表中的元素,b 代表的是阻塞功能如果队列为空则进入阻塞状态,等待队列有元素时获取。
    虽然阻塞取出元素可以解决循环取出问题,但需要注意的是,每个客户端都会有超时时间,一旦阻塞时间过长会断开连接,此时需要在客户端对异常进行处理。
    讲回延迟队列,既然队列实现了,那么我们的延迟功能实际上可以利用 Redis 的 Zset 来操作,其中 value 为消息的序列化信息,score 为到期执行时间,接着我们可以使用多个线程对 Zset 进行轮询获取到期的消息存入 list 中,这样可以粗糙地实现一个延时队列。