Spring+Redis実装メッセージキュー

2774 ワード

一、概説
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 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 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データを処理していることが分かるが,ここでは異なる方法でメッセージ呼び出しのブロックを実現できることに注意する.ソースアドレス:クリックしてリンクを開く