Spring+Redis實現訊息佇列
阿新 • • 發佈:2019-01-24
一、概述
針對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資料,注意這裡根據使用不同的方法就可以實現訊息呼叫的阻塞。原始碼地址:點選開啟連結