一、redis做消息队列
1. redis存储的list数据是双向链表实现的,可以作为队列
2. 使用lpush和rpop实现入队和出队
3. 每次使用lpush和rpop都要发起一次连接,性能不好
4. 这是一次生产,一次消费的队列
二、发布/订阅模式(publish/subscribe),也是作为消息队列
1. 可以一次生产,多次消费
2. 发布:PUBLISH channel message
jedis.publish(CHANNEL_KEY, message);
3. 消费:SUBSCRIBE channel
1 //消息处理,接收到消息时如何处理 2 JedisPubSub jps = new JedisPubSub() { 3 /** 4 * JedisPubSub类是一个没有抽象方法的抽象类,里面方法都是一些空实现 5 * 所以可以选择需要的方法覆盖,这儿使用的是SUBSCRIBE指令,所以覆盖了onMessage 6 * 如果使用PSUBSCRIBE指令,则覆盖onPMessage方法 7 * 当然也可以选择BinaryJedisPubSub,同样是抽象类,但方法参数为byte[] 8 */ 9 @Override 10 public void onMessage(String channel, String message) { 11 if(Publisher.CHANNEL_KEY.equals(channel)) { 12 System.out.println("接收到消息: channel : " + message); 13 //接收到exit消息后退出 14 if(EXIT_COMMAND.equals(message)) { 15 System.exit(0); 16 } 17 18 } 19 } 20 21 /** 22 * 订阅时 23 */ 24 @Override 25 public void onSubscribe(String channel, int subscribedChannels) { 26 if(Publisher.CHANNEL_KEY.equals(channel)) { 27 System.out.println("订阅了频道:" + channel); 28 } 29 } 30 }; 31 //可以订阅多个频道 当前线程会阻塞在这儿 32 jedis.subscribe(jps, channel);
二、特点
1. 客户端在订阅了消息之后,可以继续订阅,取消订阅,PING,QUIT结束连接
2. 发布的消息在Redis上不存储,因此必须先订阅,再发布
3. 订阅的通道名称支持glob模式匹配
三、API
1. SUBSCRIBE执行订阅
2. PSUBSCRIBE执行glob模式订阅
3. UNSUBSCRIBE取消订阅
4. PUNSUBSCRIBE取消glob模式订阅
5. PUBLISH发布消息
6. PUBSUB执行状态查询
参考:
https://blog.csdn.net/azurelaker/article/details/85045183
https://blog.csdn.net/u011489043/article/details/78780255