Redis分布式阻塞队列

1. 数据结构List

  • Redis List的主要操作为lpush/lpop/rpush/rpop四种,分别代表从头部和尾部的push/pop,除此之外List还提供了两种pop操作的阻塞版本blpop/brpop,用于阻塞获取一个对象

2. 实现思路

  1. 利用list数据结构的阻塞操作实现take方法, 当队列元素为空是则线程阻塞
  2. 此处假设redis队列不会被存满,所以push操作不会阻塞

3. 具体实现

package com.hgy.common.redis;

import redis.clients.jedis.Jedis;

import java.util.List;

public class RedisBlockingQueue<T> {

    private Jedis jedis;
    private String queueName;

    public RedisBlockingQueue(Jedis jedis, String queueName) {
        this.jedis = jedis;
        this.queueName = queueName;
    }

    public T take() {
        System.out.println();
        List<String> datas = jedis.brpop(0, queueName);
        System.out.println(Thread.currentThread().getName() + "===>" + datas.get(1));
        return (T) datas.get(1);
    }


    public void push(T msg) {
        jedis.rpush(queueName, msg.toString());
    }

}

测试

  • 消费者

    public static void main(String[] args) {

        IntStream.range(1, 6).forEach( (s)-> {
            new Thread(()->{
                Jedis client = new Jedis("192.168.200.128", 6379);
                RedisBlockingQueue<String> blockingQueue = new RedisBlockingQueue<>(client, "blockingQueue");
                while (true) {
                    blockingQueue.take();
                }
            }).start();
        });
    }
  • 生产者
    public static void main(String[] args) {
        Jedis client = new Jedis("192.168.200.128", 6379);
        RedisBlockingQueue<String> blockingQueue = new RedisBlockingQueue<>(client, "blockingQueue");
        for (int i = 0; i < 10; i++) {
            blockingQueue.push("msg" + i);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值