C# 将到期日添加到Redis缓存

C# 将到期日添加到Redis缓存,c#,caching,redis,C#,Caching,Redis,我已经在我的C项目中实现了Redis缓存。我只想知道如何使Get重载,以接受超时值。我认为这是向我的redis缓存提供程序添加过期信息的最佳方式。 下面是我的代码: public async Task<T> GetAsync<T>(string key) { return (await _cacheClient.Db0.GetAsync<T>(key).ConfigureAwait(false)); } /// <summary> ///

我已经在我的C项目中实现了Redis缓存。我只想知道如何使Get重载,以接受超时值。我认为这是向我的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;
}

最好在StackExchange中使用KeyExpire函数,这样Redis就可以自己处理过期问题。我的意思是,每次添加一个要缓存的密钥时,都应该添加一个过期的密钥,因此每次获取该密钥时,如果该密钥过期,则结果为null,您可以处理它

代码示例如下所示:

cache.Add("Key","Value1");
cache.KeyExpire("Key", new TimeSpan(0, 0, 30));


正如评论中所建议的

最好使用带过期的Add,这样Readis就可以通过自身来处理过期。我的意思是,每次向redis添加密钥时,它都应该添加过期,因此每次获取密钥时,如果密钥过期,结果都是null。这是什么redis客户端API?这很重要,因为我们需要知道什么是可用的;此外,RunSync听起来是个可怕的想法,而sync over async则非常危险;坦率地说,Exists后跟GetAsync也是一个坏主意,因为这是a:两个往返,b:一个实例竞争条件;另外-您是否打算在写入值时设置超时?或者在读取滚动到期的值时?两者都是possible@AlirezaMahmoudi我将如何使用带过期的Add,你能告诉我任何文档吗?你的redis客户端是什么?如果可能,最好使用原子版本;例如,db.StringSetAsyncKey1,Value1,new TimeSpan0,0,30-请注意,SE.Redis没有Add方法
StringSetAsync("Key1", "Value1", new TimeSpan(0, 0, 30))