【问题标题】:What is a good way to implement cache aside pattern?什么是实现缓存备用模式的好方法?
【发布时间】:2018-03-02 06:37:26
【问题描述】:

例如,我有一些存储库来获取我需要的一些数据:

Addressrepository.GetAddress(string para1, string para2)

UserRepository.GetUserDetail(string userName)

FinancialRepository.GetFinancialInfo(int userId)

要应用缓存模式,我想这样做:

  1. 基于传入的参数和每个标识符的一些标识符 存储库,构造一个密钥。
  2. 检查内存缓存(如果我们沿着这条路线检查,则检查 redis 缓存)。
  3. 如果信息找不到或过期,调用repository函数抓取数据并放入缓存。

理想情况下,我想为所有数据加载函数编写一个通用帮助类来执行此操作。类似于此处描述的缓存模式: https://blog.cdemi.io/design-patterns-cache-aside-pattern/

但是,就我而言,我需要将不同的参数传递给不同的方法。在这种情况下,是否可以使用 Func 并传递不同的参数?

我检查了msdn关于这个:

Func<T1, T2, T3, T4, T5, T6, T7, T8, TResult> Delegate

但是如何传递不同类型的参数和不同数量的参数呢?

【问题讨论】:

  • 根据您的要求“将不同的参数传递给不同的方法”的模糊性,这有点难以回答。你能举一些例子来说明你想做什么吗?

标签: c# caching design-patterns


【解决方案1】:

最简单的方法是根本不传递参数,而是进行变量捕获。

public T GetOrAdd<T>(string key, Func<T> builder)
{
    var result = _someCache.Get<T>(key);
    if(result != null)
       return result;

    result = builder();
    _someCache.Add(key, result);
    return result;
}

习惯了

var address = myCache.GetOrAdd<Address>(AddressKeyBuilder(para1, para2), 
                                        () => Addressrepository.GetAddress(para1, para2)
                                       );

这与 ConcurrentDictionary 用于 GetOrAdd method 的模式相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-27
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2017-06-20
    • 2015-10-20
    相关资源
    最近更新 更多