Tag: redis

如何使用Azure Worker Role和OWIN扩展SignalR

SignalR使用Azure Web角色非常精确地扩展。 但是,当我在Azure辅助角色中使用自托管OWIN项目时,SignalR将在添加多个实例时开始出现问题。 为了记录,我的项目使用Redis作为背板。 将Azure辅助角色实例增加到一个以上时,客户端连接将随机失败,并显示错误“ConnectionId格式不正确” 。 我认为这是由于负载均衡导致单个客户端的协商跨越多个服务器时引起的; 我不相信参与协商的多个服务器可以解密数据(DPAPI在封面下?)。 我尝试在app.config中设置 validationKey和decryptionKey,但这似乎没有什么区别; 问题依然存在。 同样,该项目将作为Web角色(IIS)正常工作,但不能作为工作者角色(OWIN自托管)。 假设这是DpapiDataProtectionProvider的问题,我如何确保提供程序在多个服务器/实例之间呈现相同的加密/解密结果? 解 SignalR(DpapiDataProtectionProvider)使用的默认保护提供程序似乎不支持Azure Worker Role scaleout。 通过滚动我自己的示例提供程序,我能够扩展SignalR / OWIN / Azure Worker并且不会收到随机400 HTTP /“ConnectionId的格式不正确”。 请记住,以下示例不会保护/保护令牌。 public class ExampleDataProvider : IDataProtector { public byte[] Protect(byte[] userData) { Trace.TraceInformation(“Protect called: ” + Convert.ToBase64String(userData)); return userData; } public byte[] Unprotect(byte[] protectedData) { Trace.TraceInformation(“Unprotect called: ” + […]

无法使用ASP.NET会话状态提供程序连接到Redis服务器

我一直试图用Redis替换ASP.NET Session一段时间了。 使用Redis的Microsoft ASP.NET会话状态提供程序的多个小时没有结果。 我们为Redis提供了本地Sentinel配置。 最初我认为这不起作用,因为提供商不支持Sentinels。 我切换连接字符串以使用主服务器,希望我至少能够建立连接。 依然没有。 我已尝试为此提供程序进行多种配置,并不断收到“无法连接请求”或“其他信息:无法连接到redis服务器;要创建断开连接的多路复用器,请禁用AbortOnConnectFail。UnableToResolvePhysicalConnection on PING“。 以下是我尝试过的一些配置: 尝试#1: 尝试#2: 尝试#3: 我发现这个提供商的文档很少,故障排除一直是个挑战。 与Microsoft提供商相比,我遇到了第三方提供商,并决定尝试使用它。 我能够使用以下配置成功连接Harbour.RedisSessionStateStore : 有了这个想法,Microsoft提供商的连接字符串的正确格式是什么? 我可以更容易地从第一方图书馆获得内部支持,而在这一点上,让这项工作成为一种道德上的胜利。 此外,如果有人知道我如何配置它来命中Sentinel并确定要连接的主实例,我会欢迎博客文章或任何关于该主题的知识分享。 谢谢!

Redis Pub / Sub ServiceStack,取消线程

这可能是一个更通用的线程问题,我不确定。 但我有一个WPF应用程序订阅频道并侦听来自redis数据库的消息。 App.SubscriptionThread = new Thread(() => { _redisSubscription.SubscribeToChannels(“ChannelA”, “ChannelB”); }); App.SubscriptionThread.Start(); 一旦我开始这个,我不知道如何阻止它。 我尝试过的事情。 使用Thread.Abort 。 这显然不会阻止它,因为线程只是永远挂起(没有取消订阅)。 使用UI线程中的_redisSubscription.UnSubscribeFromAllChannels() 。 这也导致应用程序永远进入阻塞状态 使用Environment.Exit(0)强制关闭。 这个似乎可以解决问题。 不幸的是它也有……好……关闭我的应用程序的副作用。 如何停止聆听,我可以随意连接/重新连接? 我是通过在新线程中启动SubscribeToChannels来做错的吗?

使用Azure中的ASP.NET Core在Redis中保存用户会话

我正在使用redis缓存来保存项目中的一些东西。 我正在使用Azure(WebApp),当我在我的预生产环境到生产之间进行SWAP时,用户会话丢失了,他需要重新登录我的网页。 我正在使用Identity 3.0,使用UseCookieAuthentication。 我想在Redis中存储“会话”以便在我进行交换时解决我的问题。 我没有找到有关它的信息,有什么想法吗? 谢谢 Startup.cs代码配置服务: public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddApplicationInsightsTelemetry(Configuration); // Registers MongoDB conventions for ignoring default and blank fields // NOTE: if you have registered default conventions elsewhere, probably don’t need to do this //RegisterClassMap.Init(); AutoMapperWebConfiguration.Configure(); services.AddSingleton(); // Add Mongo Identity services to the services container. […]

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 假设是这种情况,那么实现可以解决这个愚蠢问题的连接管理器的最佳方法是什么。 我假设我不应该为每个工作单元创建一个连接吗?

Redis serviceStack池化连接客户端

我正在设计一个使用Redis作为数据库的Web服务,我想知道使用Redis连接StackService客户端的最佳实践。 关键是我一直在阅读Redis,我发现与服务器交互的最佳方式是使用单个并发连接。 问题是,尽管每次Web客户端向Web服务发出请求时我都在使用PooledRedisClientManager ,但我得到了一个连接到redis服务器的连接客户端(打开的连接),并且这个连接的客户端数量增加而且限制消耗更多更多的记忆。 样本’故障’代码: PooledRedisClientManager pooledClientManager = new PooledRedisClientManager(“localhost”); var redisClient = pooledClientManager.GetClient(); using (redisClient) { redisClient.Set(“key1”, “value1”); } 我为解决这个问题所做的是创建一个用静态RedisClient var实现单例模式的类; 如果未初始化redisClient则创建一个新的,如果是,则返回初始化的。 解: public class CustomRedisPooledClient { private static CustomRedisPooledClient _instance = null; public RedisClient redisClient = null; // Objeto sincronización para hacer el Lock private static object syncLock = new object(); private CustomRedisPooledClient() […]

PooledRedisClientManager不释放连接

我在redis中存储json数据列表并使用ServiceStack c#client访问它。 我基本上管理我自己的外键,我存储一个zrange的id,我使用我的应用程序内部的接口从zrange提取id,然后从Redis获取底层的json对象并将它们打包为列表以返回我申请的其他部分。 我正在使用PooledRedisClientManager因为我预计Redis将托管在与执行代码的服务器不同的服务器上。 我正在使用MSOpenTech Redis服务器在Windows 8上本地完成所有开发工作。 目前,我最大的挑战是客户端连接没有被关闭。 我的Redis persister正在注入一个IRedisClientManager实例(IoC是CastleWindsor)。 此代码在azure worker角色的上下文中执行。 这是我从zrange获取项目的方式: public class MyRedisPersister : IResourcePersister { IRedisClientManager _mgr; public MyRedisPersister(IRedisClientManager mgr) { _mgr = mgr; } public IResourceList Get(string key, int offset, int count) where T { using (var redis = _clientManager.GetClient()) { var itemKeys = redis.GetRangeFromSortedSet(key, offset, offset + count – […]

更新服务堆栈Redis列表

有没有正确的方法来更新IRedisList? 使用下面的示例代码,我可以修改它以删除列表,更新比萨饼并重新添加列表,但这感觉不对。 命令行文档很漂亮,但它是一个比我更大的项目,我不完全确定从哪里开始寻找。 public void UpdatePizza(Pizza pizza) { using (var redisClient = new RedisClient(Host, Port)) { IRedisTypedClient redis = redisClient.As(); IRedisList pizzas = redis.Lists[“pizzas:live”]; var toUpdate = pizzas.First(x => x.Id == pizza.Id); toUpdate.State = pizza.State; //??How to save } }

Stack Overflow,Redis和Cache失效

现在Stack Overflow使用redis,它们是否以相同的方式处理缓存失效? 即一个标识列表哈希到查询字符串+名称(我猜这个名称是某种目的或对象类型名称)。 也许他们然后直接通过id检索缓存中丢失的单个项目(绕过一堆数据库索引并使用更高效的聚簇索引)。 那很聪明(杰夫提到的补液?)。 现在,我正在努力找到一种方法来简洁地调整所有这些。 在我自己做第一次切割之前,是否有任何可以用来帮助澄清我的想法的例子? 另外,我想知道在使用.net缓存(System.Runtime.Caching或System.Web.Caching)和外出并使用redis之间的截止点。 或者Redis只是放得更快? 这是2009年的原始SO问题: https://meta.stackexchange.com/questions/6435/how-does-stackoverflow-handle-cache-invalidation 其他几个链接: https://meta.stackexchange.com/questions/69164/does-stackoverflow-use-caching-and-if-so-how/69172#69172 https://meta.stackexchange.com/questions/110320/stack-overflow-db-performance-and-redis-cache