我的应用程序在做这件事时生成了很多对象。对象是由数据库查询生成的,它们是我们ORM解决方案的一部分。使用这些对象的程序通常一个接一个地请求它们。
我想使用System.Runtime.Caching,但我不确定如何使用,因为我有特定的标准:
每个用户都可以登录到不同的数据库。适用于所有物体。
数据库可以有几个不同的公司简介。适用于大多数物体。
大多数对象是多语言的。
某些对象仅在数据库事务处于活动状态时缓存,然后在回滚或提交时转储。
想到的第一个解决方案是为缓存生成一个复杂的字符串键(即。database+company+language+object主键值),但我不确定这是否正确。我也不知道如何实现事务范围的缓存。
如果我使用自己的实现,也许我会对缓存有更多的控制权。就像这样:
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)
{
}
}发布于 2013-10-14 20:36:48
我在CMS中使用了一种非常类似的方法,它工作得很好(在CMS中,大多数对象被读了很多次,写了几次)。
当发生更新时,缓存的对象将失效。在我的缓存键字符串中,第一个参数是缓存索引,当更新发生时,该索引会发生更改。
如果您有很多更新,那么每个事务都可以做两件事。在数据库中进行更改,然后更新缓存中的对象,这样就不必使它们失效。
关于事务范围缓存,您可以保留一个包含事务对象的所有键的列表。
在事务结束时,可以循环这个列表并从缓存中删除所有这些项。
另一种方法是保存事务对象的集合,并将集合对象存储在缓存中。使用这种方法,只有要从缓存中移除的集合对象。
发布于 2013-10-14 14:50:34
考虑到所有可能发生变化的东西(数据库/公司/语言/主键),使用所有这些东西来构建唯一的缓存密钥的解决方案是合理的。我使用了一个非常类似的方案,来自我所支持的应用程序之一,它的工作没有问题。
https://stackoverflow.com/questions/19362860
复制相似问题