【发布时间】:2020-07-10 15:27:42
【问题描述】:
我已经在我的 C# 项目中实现了 Redis 缓存。我只想知道如何使我的Get<T> 重载以接受超时值。我认为这将是向我的 redis 缓存提供程序添加到期的最佳方式。
下面是我的代码:
public async Task<T> GetAsync<T>(string key)
{
return (await _cacheClient.Db0.GetAsync<T>(key).ConfigureAwait(false));
}
/// <summary>
/// Fetch item from cache
/// </summary>
/// <typeparam name="T">Return Type</typeparam>
/// <param name="key">Key identifier in cache</param>
/// <returns>Cached item</returns>
public T Get<T>(string key)
{
return AsyncHelper.RunSync(() => _cacheClient.Db0.GetAsync<T>(key));
}
/// <summary>
/// Fetch from cache, else execute operation and cache
/// </summary>
/// <typeparam name="T">Return Type</typeparam>
/// <param name="key">Key identifier in cache</param>
/// <param name="method">Method to execute</param>
/// <param name="args">Method args</param>
/// <returns></returns>
public async Task<T> GetAsync<T>(string key, Delegate method, params object[] args)
{
T result = default(T);
try
{
if (await _cacheClient.Db0.ExistsAsync(key))
{
return await _cacheClient.Db0.GetAsync<T>(key);
}
else
{
result = ExecMethod<T>(method, args);
await _cacheClient.Db0.AddAsync(key, result);
}
}
catch (Exception ex)
{
_logHandler.LogError($"Error fetching cache for key:{key}", ex);
result = ExecMethod<T>(method, args);
}
return result;
}
/// <summary>
/// Fetch from cache, else execute operation and cache
/// </summary>
/// <typeparam name="T">Return Type</typeparam>
/// <param name="key">Key identifier in cache</param>
/// <param name="method">Method to execute</param>
/// <param name="args">Method args</param>
/// <returns></returns>
public T Get<T>(string key, Delegate method, params object[] args)
{
T result = default(T);
try
{
if (AsyncHelper.RunSync(() => _cacheClient.Db0.ExistsAsync(key)))
{
result = AsyncHelper.RunSync(() => _cacheClient.Db0.GetAsync<T>(key));
}
else
{
result = ExecMethod<T>(method, args);
var added = AsyncHelper.RunSync(() => _cacheClient.Db0.AddAsync(key, result));
}
}
catch (Exception ex)
{
_logHandler.LogError($"Error fetching cache for key:{key}", ex);
result = ExecMethod<T>(method, args);
}
return result;
}
【问题讨论】:
-
最好使用带过期的
Add,这样Readis可以自行处理过期。 -
我的意思是每次你向redis添加一个key的地方都应该加上一个过期时间,所以每次你获取key时,如果过期了,结果就是null。
-
这是什么redis客户端API?这很重要,因为我们需要知道什么是可用的;另外,
RunSync听起来是个糟糕的主意(通过异步进行同步非常危险);坦率地说,Exists后跟GetAsync也是 一个坏主意,因为这是 a:两次往返,b:一个实例竞争条件;另外 - 您是否打算在 写入 值时设置超时?或者当读取滚动到期的值时? (两者都可以) -
@AlirezaMahmoudi 我将如何使用过期的
Add,你能指出我的任何文档吗? -
你是什么redis客户端?