需要一个我的asp.net mvc解决方案的缓存解决方案

时间:2013-10-14 14:43:05

标签: c# asp.net asp.net-mvc caching memorycache

我的应用程序会在执行此操作时生成大量对象。对象是由数据库查询生成的,它们是我们的ORM解决方案的一部分。使用这些对象的程序通常会逐个请求它们。

我想使用System.Runtime.Caching,但由于我有特定的标准,我不确定:

每个用户都可以登录到其他数据库。适用于所有物体。

数据库可以有多个不同的公司资料。适用于大多数物体。

大多数对象都是多语言的。

某些对象仅在数据库事务处于活动状态时进行缓存,然后在回滚或提交时进行转储。

首先想到的解决方案是为缓存生成一个复杂的字符串键(即数据库+公司+语言+对象主键值),但我不确定这是否正确。我也不确定如何实现事务范围的缓存。

如果我使用自己的实现,也许我会更多地控制缓存。像这样:

public class DatabaseCache
{
    private ConcurrentDictionary<string, ClassCache> m_databases = new ConcurrentDictionary<string, ClassCache>();

    public void Add(string database, string className, object item, params string[] itemKeys)
    {
    }
}

public class ClassCache
{
    private ConcurrentDictionary<string, KeyCache> m_cache = new ConcurrentDictionary<string, KeyCache>();

    public void Add(string className, object item, params string[] itemKeys)
    {
    }
}

public class KeyCache
{
    private ConcurrentDictionary<string, object> m_cache = new ConcurrentDictionary<string, object>();

    public void Add(object item, params string[] itemKeys)
    {
    }
}

2 个答案:

答案 0 :(得分:1)

我在CMS中使用了一种非常类似的方法,它运行得很好,(在CMS中,大多数对象被多次读取并写入几次)。

发生更新时,缓存的对象无效。在我的缓存键字符串中,第一个参数是缓存索引,它在更新发生时更改。

如果您有许多更新,每个交易都可以做两件事。在数据库中进行更改,然后更新缓存中的对象,这样就不必使它们无效。

关于事务范围的缓存,您可以保留一个列表,其中包含事务对象的所有键。

在事务结束时,您可以循环此列表并从缓存中删除所有这些项目。

另一种方法是保留事务对象的集合并将集合对象存储在缓存中。使用此方法,您只能从缓存中删除集合对象。

答案 1 :(得分:0)

考虑到所有可能变化的事情(数据库/公司/语言/主键),使用所有这些东西来构建缓存的唯一键的解决方案是合理的。我从我支持的其中一个应用程序中使用了一个非常类似的方案,它没有问题。