redis的消息队列(面试题)

介绍:Redis的队列 使用rpush/lpush操作入队列,使用rpop/lpop出队列。客户端是通过列队的pop来获取消息,然后进行处理,处理完再接着获取消息。如此循环。这就是客户端的生命周期。

问题一:队列空了会有什么影响
如果队列空了,客户端会一直pop队列,这就造成了空轮询。空轮询不但提高了客户端的cpu,也加大了服务端的qps,是的redis的查询效率变低。

处理方式
方式一:可以sleep,但是如果多个消费者就会对每个消费者进行sleep
方式二:通过blpop/brpop进行读取。阻塞读取。如果队列没有消息会阻塞一直到有消息就停止阻塞。几乎没有延时。

问题二:为什么redis消息队列不能100%可靠?
因为没有reids没有ack机制。在发送过程中消息消息是没有消息补偿机制(redis消息持久化是异步的,理论上来说,发出去的消息,都有可能丢失。传统的mq在发送的环节,都有机制确保消息被持久化到硬盘,如果没有持久化到硬盘,发送方会报错,从而进行补偿)。

问题三:延时队列怎么实现的

延时队列:可以通过zset数据结构来实现。将消息序列化成一个value,延时的事件作为score。通过score进行排序。多个线程轮询到期的任务,多个线程是避免万一单线程挂了,提高了可用性。但是要注意避免多个线程同时抢到,可以使用zrem的返回值来获取任务。

你可能感兴趣的:(redis系列,java,redis,Java,Redis,Socket,消息队列,多线程)