c# - 如何使用 CacheManager 设置 Redis 服务器池大小?

标签 c# redis cachemanager

[C#] 如何使用 CacheManager 设置 Redis Server 池大小?

高并发时出现错误:没有可用连接来服务此操作:HMGET,如何设置连接池大小?

No connection is available to service this operation: HMGET U

 at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor`1 processor, ServerEndPoint server)
   at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor`1 processor, ServerEndPoint server)
   at StackExchange.Redis.RedisDatabase.HashGet(RedisKey key, RedisValue[] hashFields, CommandFlags flags)
   at CacheManager.Redis.RedisCacheHandle`1.<>c__DisplayClass25_0.<GetCacheItemInternal>b__0()
   at CacheManager.Redis.RetryHelper.Retry[T](Func`1 retryme, Int32 timeOut, Int32 retries)
   at CacheManager.Redis.RedisCacheHandle`1.Retry[T](Func`1 retryme)
   at CacheManager.Redis.RedisCacheHandle`1.GetCacheItemInternal(String key, String region)
   at CacheManager.Redis.RedisCacheHandle`1.GetCacheItemInternal(String key)
   at CacheManager.Core.Internal.BaseCache`1.GetCacheItem(String key)
   at CacheManager.Core.BaseCacheManager`1.GetCacheItemInternal(String key, String region)
   at CacheManager.Core.BaseCacheManager`1.GetCacheItemInternal(String key)
   at CacheManager.Core.Internal.BaseCache`1.GetCacheItem(String key)
   at CacheManager.Core.Internal.BaseCache`1.Get(String key)
   at CacheManager.Core.Internal.BaseCache`1.Get[TOut](String key)

=======================

      var cache = CacheFactory.Build("RuntimeCache", settings =>
        {
            settings.WithSystemRuntimeCacheHandle("RuntimeCache")
            .WithExpiration(ExpirationMode.Sliding, TimeSpan.FromMinutes(10))
            .And
            .WithRedisConfiguration("RedisCache", config =>
            {
                config.WithAllowAdmin()
                .WithDatabase(1)
                .WithPassword(password)
                .WithEndpoint(host, port);
            })
            .WithMaxRetries(100)
            .WithRetryTimeout(50)
            .WithRedisBackPlate("RedisCache")   
            .WithRedisCacheHandle("RedisCache", true)
            .WithExpiration(ExpirationMode.Sliding, TimeSpan.FromMinutes(30));
        });

最佳答案

Stackexchange.Redis 不使用连接池,而是使用 multiplexing .

您可以通过 configuration 更改库等待同步调用的时间(默认为 1000 毫秒) => 同步超时。 (要将其与 CacheManager 一起使用,请使用基于连接字符串的配置或自己创建 Multiplexer)。 这可能会改善您的体验。

无论如何,超时和此类连接错误在大多数情况下与客户端无关,并且是由 Redis 服务器的单线程特性引起的,尤其是当您达到服务器上的内存限制并且 Redis 尝试删除键时,或者如果Redis 尝试备份到磁盘...

我无法给您更明确的答案,因为这些问题在很大程度上取决于您尝试做什么以及您使用的 Redis 服务器...

您会发现许多关于该错误的其他问答,例如见StackExchange.Redis timeout and "No connection is available to service this operation"

关于c# - 如何使用 CacheManager 设置 Redis 服务器池大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47186753/

相关文章:

C# WPF SizeChanged 事件在最大化时不更新宽度和高度

c# - 可观察的xml文档

c# - W.I.F. : Setting IsSessionMode to true, 似乎无法实现

docker - 使用 Redis 将数据提供给不安全的 docker 容器

c# - 访问模型时出现 ASP.NET Core NullReferenceException

heroku - redisClient.set :- no update no error

redis - 概念化 Redis 图?

nestjs - 如何从 NestJS CacheManager 模块获取 redis io 客户端

azure - 重新启动后连接到 Redis 缓存失败 - Azure