redis在Java(Jedis)中用作消息队列与发布订阅

redis的消息队列是

JedisFactory

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @author kangtaiyang
 * @date 2018/6/29
 */
public class RedisFactory {
    private static JedisPoolConfig config;
    private static JedisPool pool;

    private static JedisPool getJedisPool() {
        if (config == null) {
            config = new JedisPoolConfig();
            //最大连接数
            config.setMaxTotal(100);
            //最大空闲连接数
            config.setMaxIdle(100);
        }
        if (pool == null) {
            pool = new JedisPool(config, "3*.***.***.4", 6379,2000,"*****",0,null);
        }
        return pool;
    }

    public static Jedis getConnection() {
        pool = getJedisPool();
        return pool.getResource();
    }

    public static void closeConnection(Jedis jedis) {
        //如果是从池中获取的jedis,则.close方法是归还jedis到池 而不是关闭jedis
        jedis.close();
    }

}

消息队列(1发1接,用抢的,类似抢红包,用列表左入右出即可完成)

 --接受者

    用brpop阻塞线程获取列表中数据

import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisDataException;

/**
 * @author kangtaiyang
 * @date 2018/7/1
 */
public class Customer extends Thread {
    private Jedis jedis;
    private String myQq;

    public Customer(Jedis jedis, String myQq) {
        this.jedis = jedis;
        this.myQq = myQq;
    }

    @Override
    public void run() {
        getMessage();
    }

    private void getMessage() {
        while (true) {
            try{
                String message = jedis.brpop(0,myQq).get(1);
                System.out.println("我收到了信息:"+message);
                Thread.sleep(1);
                //Thread.sleep(5000);
                //Thread.sleep(10000);   不同线程等待测试负载均衡                       
            }catch (JedisDataException e){

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        new Customer(RedisFactory.getConnection(),"qq12345").run();
    }
}

 
  --发布者

import redis.clients.jedis.Jedis;

/**
 * @author kangtaiyang
 * @date 2018/7/1
 */
public class Puducer extends Thread {
    private Jedis jedis;
    private String customerQq;
    private String message;

    public Puducer(Jedis jedis, String customerQq, String message) {
        this.jedis = jedis;
        this.customerQq = customerQq;
        this.message = message;
    }


    @Override
    public void run() {
        setMessage();
    }

    private void setMessage() {
        jedis.lpush(customerQq, message);
    }

    public static void main(String[] args) {
        new Puducer(RedisFactory.getConnection(), "qq12345", "aa").setMessage();
    }
}

-----------------------------------------------------------------------------------------------

发布订阅(1发多得,订阅了的都有份,类似聊天室,redis内置了发布订阅功能,用publish和subscribe等api即可发布和订阅)

--发布者

import redis.clients.jedis.Jedis;

/**
 * 发送者客户端
 *
 * @author kangtaiyang
 * @date 2018/6/30
 */
public class Publisher {

    private final String CHANNEL = "baidu";
    private Jedis jedis;

    public Publisher() {
        jedis = RedisFactory.getConnection();
    }

    public void publish(String message) {
        jedis.publish(CHANNEL,message);
    }

    public static void main(String[] args) {
         new Publisher().publish("我是发送者哟~");
    }

}


--订阅者

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;

import java.util.Arrays;

/**
 * 接受者客户端
 *
 * @author kangtaiyang
 * @date 2018/6/30
 */
public class Subscriber {

    private final String EXIT_COMMAND = "exit";

    /**
     * 消息订阅方法
     *
     * @param jedis
     * @param channel
     */
    public void subscribe(Jedis jedis, String... channel) {
        System.out.println(Arrays.asList(channel));
        if (channel.length <= 0 || channel == null) {
            return;
        }

        /**
         * JedisPubSub类是一个没有抽象方法的抽象类,里面方法都是一些空实现
         * 所以可以选择需要的方法覆盖,这儿使用的是SUBSCRIBE指令,所以覆盖了onMessage
         * 如果使用PSUBSCRIBE指令,则覆盖onPMessage方法
         * 当然也可以选择BinaryJedisPubSub,同样是抽象类,但方法参数为byte[]
         */
        JedisPubSub pubSub = new JedisPubSub() {
            @Override
            public void onMessage(String channel, String message) {
                //接收到规定频道的信息
                if (channel.equals(channel)) {
                    System.out.println("接收到消息: " + channel + " : " + message);
                }
                //接收到exit消息后退出
                if (EXIT_COMMAND.equals(message)) {
                    System.exit(0);
                }
            }

            @Override
            public void onPMessage(String s, String s1, String s2) {

            }

            /**
             * 订阅时
             *
             * @param channel
             * @param subscribedChannels
             */
            @Override
            public void onSubscribe(String channel, int subscribedChannels) {
                if (channel.equals(channel)) {
                    System.out.println("订阅了频道:" + channel + "订阅成功数为:" + subscribedChannels);
                }
            }

            @Override
            public void onUnsubscribe(String s, int i) {

            }

            @Override
            public void onPUnsubscribe(String s, int i) {

            }

            @Override
            public void onPSubscribe(String s, int i) {

            }

        };
        jedis.subscribe(pubSub, channel);
    }

    public static void main(String[] args) {
        new Subscriber().subscribe(RedisFactory.getConnection(),"baidu");
    }
}


参考视频:慕课网-redis从入门到高可用

参考博客:CSDN-Redis学习笔记之十:Redis用作消息队列


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值