redis实现一个轻量级的高性能消息队列服务

原理:利用redis的List来做FIFO双向链表,向同一个信息list中存取元素的过程,遵循先进先出原则,redis只支持单消费者。
redis配置请百度,直接上代码:

1、消息生产者

import com.fbank.dis_common.message.dis.DisResult;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;

@RestController
public class RedisMqProducter {

    @Resource(name = "redisTemplate")
    RedisTemplate redis;

    @RequestMapping("/redis/mq/product")
    public Map redisMqProduct(@RequestBody Map map) {
        Collection values = map.values();
        if (CollectionUtils.isNotEmpty(values)) {
            Iterator iterator = values.iterator();
            while (iterator.hasNext()) {
                String str = iterator.next();
                Long size = redis.opsForList().rightPush("redisMqList", str);//从右向list添加元素
                System.out.println("向[redisMqList]中推送信息 = [" + str + "], 消息总数为[" + size + "]条");
            }
        }
        return DisResult.success();
    }
} 

2、消息消费者

import org.apache.commons.lang.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component
public class RedisMqListener {

    @Resource(name = "redisTemplate")
    RedisTemplate redis;

    /**
     * 利用redis的List来做FIFO双向链表,实现一个轻量级的高性能消息队列服务
     */
    @Scheduled(cron = "0/10 * * * * ?")
    public void execute() {
        //遵循先进先出的原则,右进左出 or 左进右出
        String obj = (String) redis.opsForList().leftPop("redisMqList");
        System.out.println("从redisMqList中获取到的消息为 = [" + (StringUtils.isBlank(obj) ? "" : obj) + "]");
    }
}

3、执行结果

redis实现一个轻量级的高性能消息队列服务_第1张图片

你可能感兴趣的:(服务中间件)