redis进阶4-消息通知、订阅发布
1 使用LPUSH+RPOP即可实现队列的概念。并通过循环,来读取list中数据。 不足:需要使用循环,每隔1s读取队列。
2 BRPOP,有消息加入队列就发通知。BRPOP会阻塞队列,RPOP不会。 BRPOP返回值介绍: 假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
redis> LLEN course
(integer) 0
redis> RPUSH course algorithm001
(integer) 1
redis> RPUSH course c++101
(integer) 2
redis> BRPOP course 30
1) "course" # 弹出元素的 key
2) "c++101" # 弹出元素的值
3 优先级队列 BRPOP 可以同时监听多个队列。
![redis进阶4-消息通知、订阅发布 数据库 数据库学习 redis进阶 消息通知]()
会从左到右依次读取。
4 发布订阅模式 publish+subscribe。 作为消息队列来说,企业中选择mq的还是多数,因为像Rabbit,Rocket等mq中间件都属于很成熟的产品,性能一般但可靠性较强,而kafka原本设计的初衷是日志统计分析,现在基于大数据的背景下也可以做运营数据的分析统计,而redis的主要场景是内存数据库,作为消息队列来说可靠性太差,而且速度太依赖网络IO,在服务器本机上的速度较快,且容易出现数据堆积的问题,在比较轻量的场合下能够适用。希望有更专业的人来总结总结。
# 对没有订阅者的频道发送信息
redis> publish bad_channel "can any body hear me?"
(integer) 0
# 向有一个订阅者的频道发送信息
redis> publish msg "good morning"
(integer) 1
# 向有多个订阅者的频道发送信息
redis> publish chat_room "hello~ everyone"
(integer) 3
# 订阅 msg 和 chat_room 两个频道 # 1 - 6 行是执行 subscribe 之后的反馈信息 # 第 7 - 9 行才是接收到的第一条信息 # 第 10 - 12 行是第二条 redis> subscribe msg chat_room Reading messages... (press Ctrl-C to quit) 1) "subscribe" # 返回值的类型:显示订阅成功 2) "msg" # 订阅的频道名字 3) (integer) 1 # 目前已订阅的频道数量 1) "subscribe" 2) "chat_room" 3) (integer) 2 1) "message" # 返回值的类型:信息 2) "msg" # 来源(从那个频道发送过来) 3) "hello moto" # 信息内容 1) "message" 2) "chat_room" 3) "testing...haha"
1 使用LPUSH+RPOP即可实现队列的概念。并通过循环,来读取list中数据。 不足:需要使用循环,每隔1s读取队列。
2 BRPOP,有消息加入队列就发通知。BRPOP会阻塞队列,RPOP不会。 BRPOP返回值介绍: 假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
redis> LLEN course
(integer) 0
redis> RPUSH course algorithm001
(integer) 1
redis> RPUSH course c++101
(integer) 2
redis> BRPOP course 30
1) "course" # 弹出元素的 key
2) "c++101" # 弹出元素的值
3 优先级队列 BRPOP 可以同时监听多个队列。
会从左到右依次读取。
4 发布订阅模式 publish+subscribe。 作为消息队列来说,企业中选择mq的还是多数,因为像Rabbit,Rocket等mq中间件都属于很成熟的产品,性能一般但可靠性较强,而kafka原本设计的初衷是日志统计分析,现在基于大数据的背景下也可以做运营数据的分析统计,而redis的主要场景是内存数据库,作为消息队列来说可靠性太差,而且速度太依赖网络IO,在服务器本机上的速度较快,且容易出现数据堆积的问题,在比较轻量的场合下能够适用。希望有更专业的人来总结总结。
# 对没有订阅者的频道发送信息
redis> publish bad_channel "can any body hear me?"
(integer) 0
# 向有一个订阅者的频道发送信息
redis> publish msg "good morning"
(integer) 1
# 向有多个订阅者的频道发送信息
redis> publish chat_room "hello~ everyone"
(integer) 3
# 订阅 msg 和 chat_room 两个频道 # 1 - 6 行是执行 subscribe 之后的反馈信息 # 第 7 - 9 行才是接收到的第一条信息 # 第 10 - 12 行是第二条 redis> subscribe msg chat_room Reading messages... (press Ctrl-C to quit) 1) "subscribe" # 返回值的类型:显示订阅成功 2) "msg" # 订阅的频道名字 3) (integer) 1 # 目前已订阅的频道数量 1) "subscribe" 2) "chat_room" 3) (integer) 2 1) "message" # 返回值的类型:信息 2) "msg" # 来源(从那个频道发送过来) 3) "hello moto" # 信息内容 1) "message" 2) "chat_room" 3) "testing...haha"