总的问题是:在使用 Redis 进行发布订阅时,当发布者将消息推送到频道的速度快于订阅者读取消息的速度时,会发生什么?
例如,假设我有:
- 一个简单的发布者,每秒发布2个消息。
- 一个简单的订阅者,每秒读取消息1次。
我天真地认为订阅者只能看到Redis上发布的50%的消息。为了测试这个理论,我编写了两个脚本:
pub.py
queue = redis.StrictRedis(host='localhost', port=6379, db=0)
channel = queue.pubsub()
for i in range(10):
queue.publish("test", i)
time.sleep(0.5)
sub.py
r = redis.StrictRedis(host='localhost', port=6379, db=0)
p = r.pubsub()
p.subscribe('test')
while True:
message = p.get_message()
if message:
print "Subscriber: %s" % message['data']
time.sleep(1)
结果
- 当我先运行
sub.py
,紧接着运行pub.py
时,我发现sub.py
实际上按顺序显示了所有的消息(1-10),每个消息之间有1秒的延迟。我的初步假设是错误的,Redis在排队消息。需要进行更多测试。 - 当我先运行
pub.py
,然后等待5秒钟再运行sub.py
时,我发现sub.py
只显示了消息的后半部分(5-10)。原本我会这样假设,但考虑到之前的结果,我认为消息已经排队,这导致我得出了以下结论...
结论
- Redis服务器似乎为每个客户端、每个通道排队消息。
- 只要客户端在监听,无论读取消息有多快都不重要。只要它保持连接,消息就会为该客户端、该通道保留在队列中。
剩余问题
- 这些结论是否有效?
- 如果有效,客户端/通道消息将保留多长时间?
- 如果有效,是否有一个
redis-cli info
命令可以查看有多少消息排队(对于每个客户端/通道)?