Redis事件是一劳永逸的。如果没有人在听,他们将不会被发现。没有历史但是我在互联网上找不到任何可以回答以下问题的东西(我正在使用redis-py和aioredis用于python):
代码实际上是否需要监听事件才能接收它,否则redis连接会为我缓存事件吗?
假设我有这个循环:
redis_db = Redis(...)
while True:
print("Hey, I'm listening now!")
msg = redis_db.blocking_subscribe("some_topic") # pseudo-code, because I'm using various libraries
if msg == "calc":
do_a_heavy_5_seconds_calculation()
print("YAY, I was busy and am back up now!")
所以我会错过5s计算中发生的所有事件,还是我的redis_db
为我缓存它们?
换句话说,如果我没有连接或有连接,但是是不听,则免除即付即用吗?
正如您提到的,如果您使用的是Redis Pub / Sub,那将是一场大火,并且忘记了,因此您的应用程序必须启动并运行并收听事件。
我不得不说我还没有测试您的用例。
为了您的逻辑,有更多控制权,建议您查看Redis Streams。
您的伪代码将很容易在Streams中实现,并且具有更好的控制。
“即发即弃”适用于服务器与客户端的合同。这意味着,假设客户端已连接,则消息仅发送一次。如果消息在网络中丢失并且永远不会到达客户端,那么就是这样。如果消息到达客户端,并且客户端进程/服务器在读取消息之前崩溃,那么就是这样。
在您的情况下,客户端(redis-py)侦听与服务器建立连接的网络套接字。套接字本身由操作系统处理,并缓冲传入的消息。只要您继续从套接字中读取消息来耗尽套接字,消息就不会丢失。
两者都有。您需要一个连接,并且该连接必须处于“订阅”状态。一旦执行“ blocking_subscribe”方法,您就已经有效地将连接状态更改为“ subscription state”,因此无论您的python线程是否正在忙于同时处理其他消息,redis都会继续为您缓冲这些消息。当然,现在,如果它由于任何原因崩溃,并且这是当时唯一的连接,则缓冲区将丢失。