我们使用redis的list作为消息队列。
lpush,rpop。左进右出。
当队列空了怎么办?客户端是通过队列的 pop 操作来获取消息,然后进行处理。处理完了再接着获取消息,再进行处理。可是如果队列空了,客户端就会陷入 pop 的死循环,不停地 pop,没有数据,接着再 pop,又没有数据。这就是浪费生命的空轮询。
我们可以在程序中sleep一下,每pop一下都sleep(1)一下。
但是当push的速度很快,那处理速度就变得太慢了,sleep(0.1)?和没解决有啥不同?
使用 brpop,阻塞读,当没有数据,直接休眠。但是休眠时间太长,redis会直接断开连接。所以要做好异常处理。
------看书笔记,过些时候回头看,自己给自己找茬。
网友评论