Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis在引擎盖下是如何工作的?_Redis_Signalr - Fatal编程技术网

Redis在引擎盖下是如何工作的?

Redis在引擎盖下是如何工作的?,redis,signalr,Redis,Signalr,除了阅读github中的代码外,还有关于signal.Redis包如何工作的白皮书类型的文档吗?具体而言,我想知道它为Redis添加了哪些键、更新/删除策略等。当查看Redis内部时,我所看到的只是以下调用中指定的一个键(即“signal.Redis.Sample”): 这把钥匙似乎是Redis中的计数器。我假设正在创建并快速删除其他密钥,以方便连接到Redis的每个应用服务器之间的消息 不,没有白皮书,它就像200行代码,所以没什么可吞咽的 在信号器中,每条消息都经过一个叫做消息总线的东西。当

除了阅读github中的代码外,还有关于signal.Redis包如何工作的白皮书类型的文档吗?具体而言,我想知道它为Redis添加了哪些键、更新/删除策略等。当查看Redis内部时,我所看到的只是以下调用中指定的一个键(即“signal.Redis.Sample”):


这把钥匙似乎是Redis中的计数器。我假设正在创建并快速删除其他密钥,以方便连接到Redis的每个应用服务器之间的消息

不,没有白皮书,它就像200行代码,所以没什么可吞咽的

在信号器中,每条消息都经过一个叫做消息总线的东西。当您希望跨节点(或进程或应用程序域)扩展时,此总线的实现需要能够与应用程序的每个实例进行通信。为此,您可以使用RedisMessageBus。Redis有一种机制以及存储键值对的能力,我们只将前者用于Signal

离题:这非常重要!信号器不是可靠的消息传递,它是一种连接抽象。我们可能会为长轮询缓冲消息,但您**不能*永远依赖消息。如果您有需要持久化的重要消息,请持久化它们

每个web服务器连接到一个(或新实现中的多个)redis事件以在它们之间发送消息。当一个或多个客户端收到消息时,它将被发送到背板(redis),并到达所有web服务器。每个Web服务器从redis获取消息并将其存储在本地缓存中。此本地缓存是为信号器客户端(浏览器等)提供服务的地方

扩展设计的一个重要部分是游标。游标表示特定客户端在无限消息流中的位置。当客户端在断开连接后重新连接时,或者长轮询连接在收到消息后返回时,它会要求总线从某个游标值获取所有内容。游标是由消息总线实现定义的,我们已经在最新的源代码中对此进行了规范化(在编写本文时还没有发布,但我不会在这里详细介绍)。当前redis实现中的游标只是一个递增的数字,并不复杂


希望这能让您了解它的工作原理。

非常感谢。很好的解释,谢谢你的解释。请考虑下面的场景:我有一个负载均衡的Web场,每个服务器都承载一个集线器。让我们假设所有客户端都回到长轮询。客户端X通过负载平衡器连接,其请求被发送到服务器1。但是,在下一次轮询时,负载平衡器将其请求定向到服务器2。我的问题是,背板是否确保所有集线器都知道所有连接的客户端,而不管它们最初连接到哪个集线器?背板知道所有服务器,所以一切都正常工作。它不需要知道最初连接到哪个服务器。
GlobalHost.DependencyResolver.UseRedis(server, Int32.Parse(port), password, "SignalR.Redis.Sample");