在c#async中使用Redis缓存后CPU使用率很高

时间:2017-04-06 13:06:53

标签: 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缓存并从DB返回直接值,我可以在2分20秒内执行1300请求的加载。 CPU高仍然能够完成加载。

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

如果我只是将下面的函数修改为getDatabase并且什么也不做。它导致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 cache = Connection.GetDatabase(); ?

1 个答案:

答案 0 :(得分:2)

你的&#34;连接&#34;财产实施?是否在每次通话时都创建了与Redis的新连接?如果是这样,那就不推荐了。您应该在通话中共享一个连接。

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

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