2

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

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

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

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

4

1 回答 1

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 真的了解内存/缓存集合。一旦你理解了这些概念,看看缓存算法

希望这可以帮助。

于 2012-06-19T16:38:45.283 回答