异步消息队列list

Redis的list也可以作为异步消息队列来使用,当然,你可以用来处理非重要数据,如果是重要数据的话,建议还是使用专业的MQ消息队列。

list使用rpush/lpush入队列、lpop和rpop出队列。

说白了,就是建立一个循环来不停的通过lpop、rpop来获取消息,如果list长度为0,那么就sleep 1秒后再继续循环获取消息。但是,这种编写代码方式有个问题,就是假如有N个消费者,那么每个消费者sleep 1秒的话,那这可是一个很长的时间呢,这会导致list面对大量rpush/lpush时,会快速增长。

这里用blpop、brpop来取代lpop、rpop命令,因为b是blocking缩写即阻塞读,当队列没有数据的时候,队列进入休眠状态,当数据到来后则立即处理,且消息的延迟几乎为零,这样就可以完美解决sleep 1秒的问题以及N个消费者sleep 1秒所引发的后果。

这里注意个问题,如果线程一直阻塞,说明客户端一直没有发送消息,那么服务器可能会主动断开连接,这个时候blpop/brpop会抛出异常,因此编写客户端消费者时注意捕获异常,还要重试。

扩展

Redis2.8之后,通过set扩展参数来实现获取锁、释放锁的操作,当获取锁失败之后,通常有3个方式来处理:

直接抛出异常让用户自己决定下一步操作

sleep一段时间再去重试

把获取锁的请求放到延时队列中,过段时间再去尝试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值