我们目前有一个应用程序框架,我们在其中自动缓存业务层的实体和实体集合(使用.NET缓存)。因此,方法GetWidget(int id)在命中数据库之前使用键GetWidget_Id_ {0}检查缓存,方法GetWidgetsByStatusId(int statusId)使用GetWidgets_Collections_ByStatusId_ {0}检查缓存。如果对象不在缓存中,则从数据库中检索它们并将其添加到缓存中。
这种方法对于读取方案来说显然很快,并且我们可以快速实施一揽子方法,但是当在实体上执行CRUD操作时需要清除大量缓存键。显然,随着其他方法的增加,这会影响性能,缓存的好处也会减少。
我对处理集合缓存的替代方法感兴趣。我知道NHibernate会缓存集合中的标识符列表,而不是实际的实体。这是其他人尝试过的方法 - 有什么优点和缺点?
特别是我正在寻找优化性能的选项,并且可以通过样板生成的代码自动实现(我们有自己的代码生成工具)。我知道有些人会说每次都需要手工完成缓存以满足特定情况的需要,但我正在寻找一些可以让我们自动完成任务的东西。
答案 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。一旦理解了这些概念,请查看缓存算法
希望这会有所帮助。