Redis使用List实现消息队列MQ,生产者lpush入队,消费者brpop出队。
brpop比rpop好的地方是队列里没元素了会阻塞等待,避免无效循环调用。
Redis持久化机制避免消息丢失。
不同名字的List,放不同种类的消息,保证同一个list里消息的顺序性和不同种类的消息的解耦合,多List也可以提高消息插入和消费的速度。
可以用来实现MQ,可以作为MQ消息堆积时的临时处理方案,还可以作为MQ挂掉后的降级方案。
import redis.clients.jedis.Jedis;
public class ListMQExample {
public static void main(String[] args) throws InterruptedException {
// 消费者
new Thread(() -> bConsumer()).start();
// 生产者
producer();
}
/**
* 生产者
*/
public static void producer() throws InterruptedException {
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 推送消息
jedis.lpush("mq", "Hello, Java.");
Thread.sleep(1000);
jedis.lpush("mq", "message 2.");
Thread.sleep(2000);
jedis.lpush("mq", "message 3.");
}
/**
* 消费者(阻塞版)
*/
public static void bConsumer() {
Jedis jedis = new Jedis("127.0.0.1", 6379);
while (true) {
// 阻塞读
for (String item : jedis.brpop(0,"mq")) {
// 读取到相关数据,进行业务处理
System.out.println(item);
}
}
}
}