GVKun编程网logo

在Azure VM中使用Booksleeve Redis客户端时的Redis连接错误(azure redis cache)

26

如果您对在AzureVM中使用BooksleeveRedis客户端时的Redis连接错误感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于在AzureVM中使用Bookslee

如果您对在Azure VM中使用Booksleeve Redis客户端时的Redis连接错误感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于在Azure VM中使用Booksleeve Redis客户端时的Redis连接错误的详细内容,我们还将为您解答azure redis cache的相关问题,并且为您提供关于.NET redis 客户端开源组件 FreeRedis (继 CSRedisCore 之后重写)、asp.net – 使用Booksleeve维护开放的Redis PubSub订阅、Azure上的SailsJS Redis连接字符串、c# – 如何使用Booksleeve实现Redis流水线请求?的有价值信息。

本文目录一览:

在Azure VM中使用Booksleeve Redis客户端时的Redis连接错误(azure redis cache)

在Azure VM中使用Booksleeve Redis客户端时的Redis连接错误(azure redis cache)

我最近开始在新的Azure
VM上托管我的一个副项目。该应用程序将Redis用作内存缓存。在本地环境中一切正常,但是现在我已将代码移至Azure,我发现Bookleeve中出现了一些奇怪的异常。

当应用首次启动时,一切正常。但是,在闲置约5-10分钟后,对应用程序的下一个请求遇到了网络异常(我现在正在工作,并且没有确切的错误消息,因此我回到家时会张贴这些消息,如果人们认为他们与讨论密切相关),这将导致内部MessageQueue关闭,从而导致随后的每个Enqueue()都引发异常(“队列已关闭”)。

因此,经过一番谷歌搜索后,我发现了这样的帖子:使用BookSleeve关于DIY连接管理器维护开放的Redis连接。如果那是最好的做法,那么我当然可以实施类似的措施。

所以,问题:

  1. RedisConnection在一定时间后定期关闭是否正常?
  2. 我已经看过该conn.SetKeepAlive()方法,但是我尝试了许多不同的值,但似乎没有任何作用。还有更多的东西吗?还是我吠错了树?
  3. 上面的帖子中的连接管理器想法是处理这种情况的最佳方法吗?
  4. 任何人都可以进一步说明为什么在新的Azure VM中托管我的Redis实例会导致此问题吗?我还可以确认,如果我对Azure Redis VM运行本地环境,则会遇到此问题。

就像我说的那样,如果不活动后Redis连接死掉是不寻常的,那么我回到家时会从日志中发布堆栈跟踪和异常。

谢谢!

UPDATE
Didier在评论中指出,这可能与Azure使用的负载平衡器有关:http :
//blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-
balancer-
超时详细信息

假设是这种情况,那么实现可解决此愚蠢问题的连接管理器的最佳方法是什么。我假设我不应该为每个工作单元创建连接,对吗?

答案1

小编典典

从其他答案/评论来看,这听起来像是由于天青的基础架构关闭了看上去空闲的套接字而引起的。您 可能
只是在某个地方有一个定期执行某种操作的计时器,但是请注意,它已经内置在Booksleeve中:在连接时,它会检查redis连接超时,并配置心跳以防止redis关闭套接字。您可能可以背负此操作,以防止天蓝色也关闭套接字。例如,在redis-
cli会话中:

config set timeout 30

应该将redis(运行中,无需重新启动)配置为具有30秒的连接超时。然后,书架应自动采取措施,以确保在30秒之前不久出现心跳。请注意,如果此操作成功,则还应该编辑配置文件,以便在下次重启后也应用此设置。

.NET redis 客户端开源组件 FreeRedis (继 CSRedisCore 之后重写)

.NET redis 客户端开源组件 FreeRedis (继 CSRedisCore 之后重写)

什么是 FreeRedis

FreeRedis 是一款 .NET redis 客户端开源组件,以 MIT 协议开源托管于 github,目前支持 .NET 5、.NETCore 2.1+、.NETFramework 4.0+、Xamarin,有可能已经支持 AOT 编译(目前未测试,但会往这个方向走)。

FreeRedis 会严格按照 FreeSql 的开源方式,做好单元测试,兼容平台,简单易用,有问必答,有求必应的态度,为中国 .NET 开源事业做一点点贡献。

感谢大家的支持,项目还未公开就已经获得 66 星。目前项目仍在起步阶段,欢迎小伙伴参与进来,贡献测试、或代码、或建议都可以。

项目当前的状态:

  • 版本 0.0.8(目前不建议使用在生产环境)
  • 单元测试 268 个
  • 支持 集群、哨兵、主从(已通过测试)
  • 支持 连接池
  • 支持 .NET5/.NETCore 2.1+/.NET4.0+
  • 支持 Redis6.0 所有类型
  • 支持 Redis6.0 RESP3 协议
  • API 仍然与 redis-cli 命令保持一致
  • 采用最宽松的开源协议 MIT https://github.com/2881099/FreeRedis

项目由来

说来话长,2016 年之前本人写了一年多 nodejs 服务端应用,使用过 node-redis 组件,真心好用。在此期间有同事不停安利 .NET 可以跨平台了,劝我快回来搞 .NET,开始我是抗拒做螃蟹第一人的,不知道是哪天下午闲着蛋疼去体验了一把 .NETCore 1.0-previewXX(不记得哪个版本了)。试了一把被吸引住了,体验感受和 expressjs 像极了,再也看不见以往 webform/mvc 的缺点。

于是我准备入坑了,入坑第一件事除了 hello world,还需要做相关调研:

  • 性能OK
  • 设计OK
  • 发展OK(暂时的定级)
  • 相关组件OK(HttpClient、Redis、Ado.NET、等等基础组件)

初始调研完成之后,接下下就要抽时间选型框架了,最终从众多框架中选择了合适团队的一款:https://github.com/simplcommerce/SimplCommerce ,在这个项目原有基础之上,结合企业规范要求定制改造,大约两个月时间完成了可生产的状态。(框架不求开始尽善尽美,只求使用中不断打磨,最终走向完美)

理想丰满现实骨干,接下来的故事就是遇到生产故障了,StackExchange.Redis、HttpClient 关于这两个组件的问题,以前讲过现在就不说了(万万没想到这么大的组件使用都能出现问题)。吃螃蟹就会掉坑,掉了坑就要想办法解决,最终与 csredis 组件结缘。

以当时的情形纵观 .NET 所有 redis 客户端组件,只有 csredis 源码最易改造支持 .NETCore(水平有限见谅),csredis 2014 年停止更新,本人于 2016 年将其改造支持 .NETCore 为主,以及增加连接池管理、集群、哨兵、redis2.8 以上的命令,在公司项目生产环境使用一年半载之后开源。

  • csredis 原源码地址:https://github.com/ctstone/csredis
  • CSRedisCore 源码地址:https://github.com/2881099/csredis

CSRedisCore 开源这到久,nuget 下载量达到 60W,收集需求若干,bug 若干(有解决了的、也有未能重现的),基于我已经对 redis 这块很熟悉,然后 redis 5.0/6.0 又新增了蛮多特性,重新写一款 bug 更少、可维护性更好的想法产生了。

经过几个月的墨迹终于走通可用了,项目最终命名:FreeRedis

感谢 Nuget 转让包的大兄弟。


如何使用

Single machine redis (单机)

public static RedisClient cli = new RedisClient("127.0.0.1:6379,password=123,defaultDatabase=13");//cli.Serialize = obj => JsonConvert.SerializeObject(obj);//cli.Deserialize = (json, type) => JsonConvert.DeserializeObject(json, type);cli.Notice += (s, e) => Console.WriteLine(e.Log); //print command logcli.Set("key1", "value1");cli.MSet("key1", "value1", "key2", "value2");string value1 = cli.Get("key1");string[] vals = cli.MGet("key1", "key2");

API 仍然与 redis-cli 命令保持一致,所以如果想了解 FreeRedis 每个方法怎么使用,去百度搜索 “redis 命令”,有很多很多很多资料。don''t say so much!!!

支持 Redis6.0 支持的所有数据类型:strings, hashes, lists, sets, sorted sets, bitmaps, hyperloglogs, geo, streams And BloomFilter.

Parameter Default Explain
protocol RESP2 If you use RESP3, you need redis 6.0 environment
user <empty> Redis server username, requires redis-server 6.0
password <empty> Redis server password
defaultDatabase 0 Redis server database
max poolsize 100 Connection max pool size
min poolsize 5 Connection min pool size
idleTimeout 20000 Idle time of elements in the connection pool (MS)
connectTimeout 10000 Connection timeout (MS)
receiveTimeout 10000 Receive timeout (MS)
sendTimeout 10000 Send t.........

asp.net – 使用Booksleeve维护开放的Redis PubSub订阅

asp.net – 使用Booksleeve维护开放的Redis PubSub订阅

我正在使用Redis pubsub通道将工作进程池中的消息发送到我的ASP.NET应用程序.收到消息后,我的应用程序将消息转发到带有SignalR的客户端浏览器.

我发现this solution保持与Redis的开放连接,但它在重新创建连接时不考虑订阅.

我目前正在Global.asax文件中处理Redis pubsub消息:

public class Application : HttpApplication
{
    protected void Application_Start()
    {
        var gateway = Resolve<RedisConnectionGateway>();
        var connection = gateway.GetConnection();
        var channel = connection.GetopenSubscriberChannel();

        channel.PatternSubscribe("workers:job-done:*",OnExecutionCompleted);
    }

    /// <summary>
    /// Handle messages received from workers through Redis.</summary>
    private static void OnExecutionCompleted(string key,byte[] message)
    {
        /* forwarded the response to the client that requested it */
    }
}

当前RedisConnection因任何原因关闭时会发生此问题.最简单的解决方案是在重置连接时从RedisConnectionGateway类触发事件,并使用新的RedisSubscriberChannel重新订阅.但是,在重置连接时发布到通道的任何消息都将丢失.

是否有任何推荐的方法来处理这种情况?

解决方法

是的,如果连接中断(网络不稳定,重新掌握,等等),那么您将需要重新应用您所做的任何订阅.重新连接和重新订阅的事件非常正常,与我们在SE / SO上使用的事件没有什么不同(除了我们通常跟踪更细粒度的订阅,并且有一些处理所有这些的包装代码).

是的,在您的连接中断时发布的任何事件都已消失.这就是redis pub / sub的本质;它不保证交付给断开连接的客户端.要么使用承诺这个的工具,要么使用redis来驱动队列 – 从列表的两端推送/弹出通常是一个合理的选择,并确保不会丢失任何东西(只要你的软件没有丢失)它从列表中弹出后).如果它有帮助,我在我的列表上有一个添加阻塞pop方法的请求 – 它们完全破坏了多路复用器的意图,但它们在某些情况下真的有用,所以我不反对添加它们.

Azure上的SailsJS Redis连接字符串

Azure上的SailsJS Redis连接字符串

我通过将以下内容添加到我的production.js文件中解决了该问题。

    session: {
        adapter: '@sailshq/connect-redis',url: 'redis://:xyz=@imageAware.redis.cache.windows.net:6379/0',cookie: {
            maxAge: 24 * 60 * 60 * 1000,secure: false
        }
    },

c# – 如何使用Booksleeve实现Redis流水线请求?

c# – 如何使用Booksleeve实现Redis流水线请求?

关于Redis事务和管道之间的区别以及最终如何使用Booksleeve的管道,我有点混淆了.我看到 Booksleeve支持Redis transaction feature(MULTI / EXEC),但其API /测试中没有提及流水线功能.但是,在其他实现中很明显,管道和事务之间存在区别,即在 atomicity中,如下面的redis-ruby版本所示,但在某些 places中,这些术语似乎可以互换使用.

redis-ruby实现:

r.pipelined {
  # these commands will be pipelined
  r.get("insensitive_key")
}

r.multi {
  # these commands will be executed atomically
  r.set("sensitive_key")
}

我只是使用MULTI / EXEC,但它们似乎阻止了所有其他用户,直到交易完成(在我的情况下不是必需的),所以我担心他们的表现.有没有人使用Booksleeve的管道或有任何关于如何实现它们的想法?

解决方法

在BookSleeve中,一切都是流水线的.没有同步操作.不是一个人.因此,每个操作都返回某种形式的Task(可能是一个vanilla任务,可能是Task< string>,Task< long>等),这在将来的某个时候(即redis响应时)将具有一个值.您可以在调用代码中使用Wait来执行同步等待,或使用ContinueWith / await(C#5语言功能)来执行异步回调.

交易没有什么不同;它们是流水线的.事务的唯一微妙变化是它们在呼叫站点被额外缓冲直到完成(因为它是一个多路复用器,我们无法开始管道与事务相关的消息,直到我们有一个完整的工作单元,因为它会对同一多路复用器上的其他呼叫者产生不利影响).

所以:没有明确的.pipelined的原因是所有内容都是流水线和异步的.

关于在Azure VM中使用Booksleeve Redis客户端时的Redis连接错误azure redis cache的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于.NET redis 客户端开源组件 FreeRedis (继 CSRedisCore 之后重写)、asp.net – 使用Booksleeve维护开放的Redis PubSub订阅、Azure上的SailsJS Redis连接字符串、c# – 如何使用Booksleeve实现Redis流水线请求?等相关知识的信息别忘了在本站进行查找喔。

本文标签: