一、概述
针对Redis,我们知道有String、List、Hash、Set、sorted Set等数据结构,而List数据结构就是一个简单的字符串列表,我们可以向列表的首部或者尾部添加或者移除元素。并且当列表中没有元素的时候会发生阻塞或者等待超时。因此我们就可以使用Redis的List数据结构的特性来实现消息队列。
二、实例
(1)消息队列的生产者
package com.liutao.redis.mq;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.Random;
/**
* Redis消息队列的生产者
* @author LIUTAO
* @version 2018/4/18 17:16
*/
@Component
public class TaskProducer implements Runnable {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Override
public void run() {
Random random = new Random();
int i = 0;
while(true){
try{
Thread.sleep(random.nextInt(600) + 600);
redisTemplate.opsForList().leftPush("task-queue","data"+i++);
System.out.println("插入了一个新的任务: " + "data"+i++);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
(2)消息队列的消费者
package com.liutao.redis.mq;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
/**
* Redis消息队列的消费者
*
* @author LIUTAO
* @version 2018/4/18 17:20
*/
@Component
public class TaskConsumer implements Runnable {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String taskid = redisTemplate.opsForList().leftPop("task-queue").toString();
System.out.println(taskid + "处理成功,被清除");
}
}
}
(3)生产者和消费者线程的使用
package com.liutao.redis.mq;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* @author LIUTAO
* @version 2018/4/18 17:40
*/
@Component
public class TaskTest {
@Autowired
private TaskConsumer taskConsumer;
@Autowired
private TaskProducer taskProducer;
@PostConstruct
public void testMq() throws InterruptedException {
new Thread(taskProducer).start();
Thread.sleep(1000);
new Thread(taskConsumer).start();
}
}
三、总结
从上面的列子我们可以看出消息队列的实现使用了Spring的工具类RedisTemplate来处理Redis数据,注意这里根据使用不同的方法就可以实现消息调用的阻塞。源码地址:点击打开链接