redis消息队列

ps:读掘金小册笔记

简单的异步消息队列

  对于一些只有一组消费者的消息队列,使用redis可以轻松解决,redis的list结构可以很好的处理,这个list的基本操作rpush,lpush,rpop,lpop即可处理队列。

队列为空怎么破

  客户端通过pop操作来获取消息,从而消费,如果队列空了,客户端就会进入pop的死循环,由于没数据,不停的pop,这种空循环不但对客户端影响很大,对redis的qps也有影响,我们则是通过sleep来解决这个问题,让线程睡一下即可,也就是暂停一秒左右。

队列延迟

  这个让线程休眠会导致消息延迟变高,有个办法可以避免这个问题,不用让线程睡眠,那就是用blpop/brpop阻塞读,阻塞读在队列没有数据的时候,会进入到休眠状态,一旦数据到来,就会立刻醒过来。

空闲连接自动断开

  如果这个线程一直阻塞在哪里,redis的客户端连接就会变成限制连接,服务器会主动断开,减少资源占用,这个时候blpop/brpop就会抛出异常。,因此编写客户端的时候要注意捕捉异常。

锁冲突处理

  请求加锁失败时:
  1.直接抛出异常。2.sleep一会再试。3.将请求移动到延时队列,过一会再试试。实现如下:
  通过zset来实现延时队列,我们将消息序列化为value,到期时间作为score,然后多个线程轮训获取到期任务处理。