在 c# async 中使用 Redis 缓存后使用率高 CPU
High CPU usage after using Redis cache in c# async
我正在使用 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 缓存并return 直接从数据库获取值,我可以在 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 使用量只随着
的增加而增加
I数据库缓存=Connection.GetDatabase(); ?
你的"Connection"属性是如何实施的?它是否在每次调用时创建与 Redis 的新连接?如果是这样,那将不被推荐。您应该在所有通话中共享一个连接。
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
return ConnectionMultiplexer.Connect("<your connection string here>");
});
public static ConnectionMultiplexer Connection
{
get
{
return lazyConnection.Value;
}
}
我正在使用 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 缓存并return 直接从数据库获取值,我可以在 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 使用量只随着
的增加而增加I数据库缓存=Connection.GetDatabase(); ?
你的"Connection"属性是如何实施的?它是否在每次调用时创建与 Redis 的新连接?如果是这样,那将不被推荐。您应该在所有通话中共享一个连接。
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
return ConnectionMultiplexer.Connect("<your connection string here>");
});
public static ConnectionMultiplexer Connection
{
get
{
return lazyConnection.Value;
}
}