caching - 在c#异步中使用Redis缓存后CPU使用率高

标签 caching stackexchange.redis

我正在使用https://github.com/StackExchange/StackExchange.Redis 。 (StackExchange.Redis.StrongName.1.2.1)

我有一个像这样的异步函数,它会导致 CPU 达到 100%,并在处理 400 个请求后 4-5 分钟后开始出现超时错误

 public async Task<T> GetOrSetAsync<T>(string cacheKey, Func<Task<T>> getItemCallback) where T : class
         {
             T item = null;
             IDatabase cache = Connection.GetDatabase();
             var cacheValue = await cache.StringGetAsync(cacheKey);
            if (cacheValue.IsNull)
            {
                item = await getItemCallback();
                await cache.StringSetAsync(cacheKey, JsonConvert.SerializeObject(item));
            }
            else
            {
                item = await Task.Factory.StartNew(() => JsonConvert.DeserializeObject<T>(cacheValue));
            }
             return item;
         }

如果我停止使用 Redis 缓存并从数据库返回直接值,我能够在 2 分 20 秒内执行 1300 个请求的负载。 CPU高仍然能够完成负载。

 public async Task<T> GetOrSetAsync<T>(string cacheKey, Func<Task<T>> getItemCallback) where T : class
         {
            return await getItemCallback();
         }

如果我只是修改下面的函数来获取数据库而不执行任何操作。它会导致CPU立即达到100%,并在2分钟内发出200个请求后卡住,这是因为CPU过高。

 public async Task<T> GetOrSetAsync<T>(string cacheKey, Func<Task<T>> getItemCallback) where T : class
         {
           IDatabase cache = Connection.GetDatabase();
            return await getItemCallback();
         }

但问题是为什么 CPU 使用率仅随着添加

IDatabase 缓存 = Connection.GetDatabase(); ?

最佳答案

您的“连接”属性是如何实现的?是否会在每次调用时创建与 Redis 的新连接?如果是这样的话,就不建议这样做了。您应该在调用之间共享一个连接。

private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
    return ConnectionMultiplexer.Connect("<your connection string here>");
});

public static ConnectionMultiplexer Connection
{
    get
    {
        return lazyConnection.Value;
    }
}

关于caching - 在c#异步中使用Redis缓存后CPU使用率高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43256135/

相关文章:

ruby-on-rails - Rails 4 在 Rails.cache.fetch 中跳过缓存

c++ - 有什么方法可以分析缓存行为的代码?

redis - 在 StackExchange.Redis 中存储 List<T> 的最佳实践

redis - 如何在Redis List中使用where条件查找记录?

redis - 如何在本地配置Redis缓存?

c# - StackExchange.Redis 是否在内存缓存中使用本地?

java - 是否建议在字段中缓存 Collections.unmodifiableList() 结果?

c# - 为特定 Controller 操作选择自定义输出缓存提供程序

python - 第一次访问后缓存返回值的类方法的装饰器

使用 flushdb 的 Redis 键空间通知