原文作者: xingguang
原文链接:https://www.tiance.club/post/4033908611.html
队列本身其实是个有序的列表,而Redis是支持list的,可以利用redis的列表(List)来实现简单队列。
一般有两种方式:
1、LPUSH(头部插入)和RPOP(尾部弹出)
2、RPUSH(尾部插入)和LPOP(头部弹出)
两种均可,下面示例使用的是:第一种:LPUSH和RPOP。
一般开发的时候我们会分为生产者和消费者,生产者生产消息,消费者获取消息进行处理。
原文作者: xingguang
原文链接:https://www.tiance.club/post/4033908611.html
Producer:
redis->lpush(‘joblist’, ‘this is Job-1’);
redis->lpush(‘joblist’, ‘this is Job-2’);
….
Cosumer:
job = redis->rpop(‘joblist’);// return Job-1
done the job….
job = redis->rpop(‘joblist’);// return Job-2
done the job…
需要注意的是redis实现的消息队列功能本身存在一些缺陷,这也是redis本身的限制,一个重要的缺陷在于没有类似RabbitMQ那样成熟的ACK消息确认机制(虽然redis也可以通过代码层自己封装写个ack消息确认机制,但相对比较繁杂。一般常见的思路是POP时将pop出的数据放到备份的地方,当有ACK请求(确认消息被消耗)后将备份的信息删除掉;每次在pop前需要检查备份队列中有没有过期的数据没有ack的,如果有则PUSH到list中后再从list中POP出来。)
一般来说如果对数据没有极高要求的又不想搭建其他QM组件的话可以直接用redis的list功能实现,如果对数据幂等性、一致性有要求的话建议使用RabbitMQ(目前功能最完善的企业级MQ产品,虽然吞吐量不是最强的,但足以应付绝大多数公司的流量)或者不想自己搭建的话也可以直接使用第三方的消息队列产品,比如阿里云的消息队列,安全性能均有保障。
原文作者: xingguang
原文链接:https://www.tiance.club/post/4033908611.html