1. 数据结构List
- Redis List的主要操作为lpush/lpop/rpush/rpop四种,分别代表从头部和尾部的push/pop,除此之外List还提供了两种pop操作的阻塞版本blpop/brpop,用于阻塞获取一个对象
2. 实现思路
- 利用list数据结构的阻塞操作实现take方法, 当队列元素为空是则线程阻塞
- 此处假设redis队列不会被存满,所以push操作不会阻塞
3. 具体实现
package com.hgy.common.redis;
import redis.clients.jedis.Jedis;
import java.util.List;
public class RedisBlockingQueue<T> {
private Jedis jedis;
private String queueName;
public RedisBlockingQueue(Jedis jedis, String queueName) {
this.jedis = jedis;
this.queueName = queueName;
}
public T take() {
System.out.println();
List<String> datas = jedis.brpop(0, queueName);
System.out.println(Thread.currentThread().getName() + "===>" + datas.get(1));
return (T) datas.get(1);
}
public void push(T msg) {
jedis.rpush(queueName, msg.toString());
}
}
测试
public static void main(String[] args) {
IntStream.range(1, 6).forEach( (s)-> {
new Thread(()->{
Jedis client = new Jedis("192.168.200.128", 6379);
RedisBlockingQueue<String> blockingQueue = new RedisBlockingQueue<>(client, "blockingQueue");
while (true) {
blockingQueue.take();
}
}).start();
});
}
public static void main(String[] args) {
Jedis client = new Jedis("192.168.200.128", 6379);
RedisBlockingQueue<String> blockingQueue = new RedisBlockingQueue<>(client, "blockingQueue");
for (int i = 0; i < 10; i++) {
blockingQueue.push("msg" + i);
}
}