如何按预期使用MemoryCache触发删除旧的缓存值

时间:2015-09-23 12:42:13

标签: c# .net caching

我正在使用以下代码,以确保我只传输一次数据库以获取我的代理数据,并在传递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}}可以在添加到缓存时传入吗?

我一直在努力寻找如何正确使用它的例子。

1 个答案:

答案 0 :(得分:2)

你的逻辑是正确的。但是,您自己管理缓存生存期,而不是依赖于内置的到期系统技术。例如,不是你要检查是否有新的contractId,删除旧的contractId并添加新的contractI,我认为你应该根据需要缓存尽可能多的contractId,但是例如绝对过期1小时。例如,如果存在contractId == 1,那么您将拥有缓存密钥1的缓存,如果另一个请求请求contractId == 2,那么您将转到db == 2的db pull contract信息并将其存储在缓存中以用于另一个绝对到期1小时左右。我认为这会更高效,而不是你自己管理缓存(添加,删除)。

在缓存中添加和删除数据时,还需要考虑锁定数据,以消除竞争条件。

你可以找到关于如何做的好例子:

Working With Caching in C#

Using MemoryCache in .NET 4.0