Redis实现任务队列
当页面需要进行发送邮件、复杂数据运算等耗时较长的操作时会阻塞页面的渲染。通常的做法是,使用多线程的方式来实现这些异步任务。但是不是所有语言都支持多线程,这时会想到通过任务队列来实现。
Redis的列表类型可以很容易地实现队列的功能,生产者通过LPUSH将任务加入到某个键中,消费者则通过BRPOP从该键中取出任务。
BRPOP和RPOP的唯一区别就是,当列表中没有元素时BRPOP命令会一直阻塞住连接,知道有新的元素加入。
优先级队列
BRPOP另外一个特性,支持对多个键的检测:
- 如果所有键都没有元素则阻塞
- 如果有一个键有元素则会从该键中弹出元素
- 如果多个键都有元素则按照从左到右的顺序取第一个键中的一个元素。
典型的适用场景就是,互联网应用中,新用户注册的邮件一定比一些通知类邮件的优先级要高,就可以采用同时消费queue:registraion.email和queue:notification.email两个队列的方式。一旦queue:registraion.email有元素,就一定优先进行处理。