1

我的应用程序在执行此操作时会生成很多对象。对象是数据库查询的结果,它们是我们 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)
    {
    }
}
4

2 回答 2

1

我在 CMS 中使用了一种非常相似的方法,并且效果很好,(在 CMS 中,大多数对象被读取多次并写入几次)。

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

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

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

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

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

于 2013-10-14T20:36:48.593 回答
0

考虑到所有可能变化的事物(数据库/公司/语言/主键),使用所有这些事物来构建用于缓存的唯一键的解决方案是一个合理的解决方案。我从我支持的一个应用程序中使用了一个非常相似的方案,它可以正常工作。

于 2013-10-14T14:50:34.847 回答