我正在使用以下代码,以确保我只传输一次数据库以获取我的代理数据,并在传递contractId
时缓存数据 refereshed 变化。
public static AgentCacher
{
private IAgentDal AgentDal;
private readonly ObjectCache AgentObjectCache;
private string LastContractId;
public AgentCacher(IAgentDal agentDal)
{
this.AgentDal = agentDal;
// Get the instance of the cache
this.AgentObjectCache = MemoryCache.Default;
}
public List<Agent> GetAgentsForContract(int contractId)
{
// Set the key to be used for the cache
var cacheKey = contractId.ToString(CultureInfo.InvariantCulture);
// Has the contract ID changed?
if (this.LastContractId !== cacheKey)
{
// Remove the item from the cache
this.AgentObjectCache.Remove(this.LastContractId);
}
// Are the agents for this contract ID already in the cache?
else if (this.AgentObjectCache.Contains(cacheKey))
{
// Return agents list from the cache
return
this.AgentObjectCache.Get(cacheKey) as
List<Agent>;
}
// Go to the database and get the agents
var agentsFromDatabase = this.AgentDal.GetAgentsForContract(contractId);
// Add the values to the cache
this.AgentObjectCache.Add(cacheKey, agentsFromDatabase, DateTimeOffset.MaxValue);
// Set the contract Id for checking next time
this.LastContractId = cacheKey;
// Return the agents
return agentsFromDatabase;
}
}
这样可行,但我觉得我可能没有像预期的那样使用MemoryCache
。
如何trigger
删除我添加到缓存中的值,以便在contractId
更改时清除旧值,是否必须使用ChangeMonitor
或{{ 1}}可以在添加到缓存时传入吗?
我一直在努力寻找如何正确使用它的例子。
答案 0 :(得分:2)
你的逻辑是正确的。但是,您自己管理缓存生存期,而不是依赖于内置的到期系统技术。例如,不是你要检查是否有新的contractId,删除旧的contractId并添加新的contractI,我认为你应该根据需要缓存尽可能多的contractId,但是例如绝对过期1小时。例如,如果存在contractId == 1,那么您将拥有缓存密钥1的缓存,如果另一个请求请求contractId == 2,那么您将转到db == 2的db pull contract信息并将其存储在缓存中以用于另一个绝对到期1小时左右。我认为这会更高效,而不是你自己管理缓存(添加,删除)。
在缓存中添加和删除数据时,还需要考虑锁定数据,以消除竞争条件。
你可以找到关于如何做的好例子: