Tag: 书架

PubSub如何在BookSleeve / Redis中工作?

我想知道使用BookSleeve发布和订阅频道的最佳方式是什么。 我目前实现了几种静态方法(见下文),它允许我将内容发布到特定通道,新创建的通道存储在private static Dictionary subscribedChannels; 。 这是正确的方法,因为我想发布到频道并订阅同一个应用程序中的频道(注意:我的包装器是一个静态类)。 即使我想发布和订阅,创建一个频道是否足够? 显然,我不会发布到在同一个应用程序中订阅的相同频道。 但我测试了它,它工作: RedisClient.SubscribeToChannel(“Test”).Wait(); RedisClient.Publish(“Test”, “Test Message”); 它工作。 在这里我的问题: 1)设置专用发布频道和专用订阅频道而不是为两者使用一个频道是否更有效? 2)语义上“channel”和“PatternSubscription”有什么区别? 我的理解是我可以在同一个频道上通过PatternSubscription()订阅几个“主题”,对吗? 但是如果我想为每个“主题”调用不同的回调,我必须为每个主题设置一个正确的通道吗? 这样有效吗?或者你会建议反对吗? 这里是代码片段。 谢谢!!! public static Task Publish(string channel, byte[] message) { return connection.Publish(channel, message); } public static Task SubscribeToChannel(string channelName) { string subscriptionString = ChannelSubscriptionString(channelName); RedisSubscriberConnection channel = connection.GetOpenSubscriberChannel(); subscribedChannels[subscriptionString] = channel; return channel.PatternSubscribe(subscriptionString, OnSubscribedChannelMessage); […]

在Azure VM中使用Booksleeve Redis客户端时出现Redis连接错误

我最近开始在新的Azure VM上托管我的一个侧面项目。 该应用程序使用Redis作为内存缓存。 在我的本地环境中,一切都运行良好,但现在我已经将代码移动到Azure了,我看到一些奇怪的例外来自Booksleeve。 当应用程序第一次启动时,一切正常。 但是,在大约5-10分钟不活动之后,对应用程序的下一个请求会遇到网络exception(我现在正在工作,并且没有确切的错误消息,所以当我回到家时我会发布它们人们认为它们与讨论密切相关)这导致内部MessageQueue关闭,这导致每个后续Enqueue()抛出exception(“队列关闭”)。 所以经过一些谷歌搜索我找到了这个post: 使用BookSleeve维护一个关于DIY连接管理器的开放Redis连接 。 如果这是最好的行动方案,我当然可以实施类似的东西。 所以,问题: RedisConnection在一定时间后定期关闭是否正常? 我见过conn.SetKeepAlive()方法,但我尝试了很多不同的值,似乎没有任何区别。 还有更多这个还是我咆哮错了树? 从上面的post开始,连接管理器的想法是处理这种情况的最佳方法吗? 任何人都可以解释为什么在新的Azure VM中托管我的Redis实例导致此问题? 我还可以确认,如果我针对Azure Redis VM运行本地环境,我会遇到此问题。 就像我说的,如果Redis连接在不活动后死亡是不寻常的,我会在回家时发布我的日志中的堆栈跟踪和exception。 谢谢! 更新 Didier在评论中指出,这可能与Azure使用的负载balanacer有关: http : //blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-超时details.aspx 假设是这种情况,那么实现可以解决这个愚蠢问题的连接管理器的最佳方法是什么。 我假设我不应该为每个工作单元创建一个连接吗?

使用BookSleeve维护打开的Redis连接

有没有人有通过BookSleeve库获取Redis的可靠模式? 我的意思是: BookSleeve的作者@MarcGravell 建议不要每次都打开和关闭连接,而是在整个应用程序中保持一个连接。 但是你怎么能处理网络中断? 即,连接可能首先成功打开,但是当某些代码尝试读取/写入Redis时,连接可能已经丢失,您必须重新打开它(如果它不能打开,则会正常失败 – 但是这取决于您的设计需求。) 我寻找覆盖一般Redis连接开放的代码片段,以及在每次读/写之前使用的一般“活动”检查(+可选唤醒,如果不活动)。 这个问题表明对这个问题有一个很好的态度,但它只是部分的(例如,它没有恢复丢失的连接),并且该问题的接受答案采用正确的方式,但没有展示具体的代码。 我希望这个主题得到可靠的答案,并最终成为一个关于BookSleeve在.Net应用程序中使用的Wiki。 —————————– 重要更新(2014年3月21日): —————————– Marc Gravell(@MarcGravell)/ Stack Exchange 最近发布了StackExchange.Redis库,最终取代了Booksleeve。 除了别的以外,这个新的库在内部处理重新连接并使我的问题变得多余(也就是说,它对于Booksleeve并不是多余的,我的答案也不在下面,但我想最好的方法是开始使用新的StackExchange.Redis库)。