【问题标题】:Add Expiry to Redis Cache将过期时间添加到 Redis 缓存
【发布时间】: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客户端?

标签: c# caching redis


【解决方案1】:

最好在StackExchange中使用KeyExpire函数,这样Redis就可以自己处理过期了。我的意思是每一个你添加一个key到缓存的地方都应该加上一个过期时间,所以每次你获取key时,如果过期了,结果为null,你可以处理它。

代码示例类似于:

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

StringSetAsync("Key1", "Value1", new TimeSpan(0, 0, 30))

按照 cmets 中的建议。 Here is how.

【讨论】:

  • 尽可能非常最好使用原子版本;例如,db.StringSetAsync("Key1", "Value1", new TimeSpan(0, 0, 30)) - 请注意 SE.Redis 没有 Add 方法
猜你喜欢
  • 2020-08-20
  • 1970-01-01
  • 2021-09-11
  • 2019-01-16
  • 1970-01-01
  • 2021-04-21
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多