1. 程式人生 > >Spring+Redis實現訊息佇列

Spring+Redis實現訊息佇列

一、概述

針對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資料,注意這裡根據使用不同的方法就可以實現訊息呼叫的阻塞。原始碼地址:點選開啟連結