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用作消息队列