实现缓存模式的好方法是什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现缓存模式的好方法是什么?相关的知识,希望对你有一定的参考价值。
例如,我有一些存储库来获取我需要的一些数据:
Addressrepository.GetAddress(string para1, string para2)
UserRepository.GetUserDetail(string userName)
FinancialRepository.GetFinancialInfo(int userId)
要应用缓存模式,我想这样做:
- 基于传入的参数和每个存储库的一些标识符,构造一个键。
- 检查内存缓存(如果我们关闭该路由,则检查redis缓存)。
- 如果无法找到或过期信息,请调用存储库函数以获取数据并将其放入缓存中。
理想情况下,我想编写一个通用的辅助类来为所有数据加载函数执行此操作。这里描述的缓存一边模式:https://blog.cdemi.io/design-patterns-cache-aside-pattern/
但是,就我而言,我需要将不同的参数传递给不同的方法。在这种情况下,是否可以使用Func并传递不同的参数?
我查了msdn这个:
Func<T1, T2, T3, T4, T5, T6, T7, T8, TResult> Delegate
但是如何传递不同的类型参数和不同数量的参数?
答案
最简单的方法是根本不传递参数,而是进行变量捕获。
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的模式相同。
以上是关于实现缓存模式的好方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章
FragmentStatePageAdapter 缓存,重新创建活动后如何引用旧片段? (对于前 - 横向模式)