实体和集合的缓存策略

时间:2012-06-19 14:43:55

标签: .net design-patterns caching architecture scalability

我们目前有一个应用程序框架,我们在其中自动缓存业务层的实体和实体集合(使用.NET缓存)。因此,方法GetWidget(int id)在命中数据库之前使用键GetWidget_Id_ {0}检查缓存,方法GetWidgetsByStatusId(int statusId)使用GetWidgets_Collections_ByStatusId_ {0}检查缓存。如果对象不在缓存中,则从数据库中检索它们并将其添加到缓存中。

这种方法对于读取方案来说显然很快,并且我们可以快速实施一揽子方法,但是当在实体上执行CRUD操作时需要清除大量缓存键。显然,随着其他方法的增加,这会影响性能,缓存的好处也会减少。

我对处理集合缓存的替代方法感兴趣。我知道NHibernate会缓存集合中的标识符列表,而不是实际的实体。这是其他人尝试过的方法 - 有什么优点和缺点?

特别是我正在寻找优化性能的选项,并且可以通过样板生成的代码自动实现(我们有自己的代码生成工具)。我知道有些人会说每次都需要手工完成缓存以满足特定情况的需要,但我正在寻找一些可以让我们自动完成任务的东西。

1 个答案:

答案 0 :(得分:0)

不确定你的问题是什么。

但是看看redis,它是一个可以使用的数据结构缓存。

根据您的定义,您正在存储GetWidget_Id_ {0},为什么要这样做?首先,您可以拥有自己的缓存,并且可以非常轻松地编写内存缓存容器。

interface ICache<K,V>{
   put(K,V)
   V get(K)
   delete(K)
}

class CacheContainer<K,V> : ICache<K,V>
{

   ConcurrentHashMap<K,V> _cache = new ....

   put impl..
   get impl..
   delete impl..

   purge..


}

你可以扩展它,并在子类中使用LRU,LFU和任何类型的缓存算法。

至于存储集合,与将项目存储为列表或集合的想法相同。

在内存/缓存集合中真正理解redis。一旦理解了这些概念,请查看缓存算法

希望这会有所帮助。

相关问题