2012-06-19 115 views
2

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

这种方法对于读取场景来说显然很快,而且我们可以快速实现,但需要在对实体执行CRUD操作时清除大量缓存键。很明显,随着其他方法的增加,这会影响性能和缓存的好处。

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

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

+1

意见问题应该在Programmers.StackExchange上:http://programmers.stackexchange.com – CAbbott

+1

@CAbbott我认为这个问题符合常见问题解答中的问题 - 它涉及到“特定的编程问题”并且是可以回答的。 –

+0

我想说,你不是在问一个“实际的编程问题”,即“我写了* X *并且它不工作”,而是你正在征求*意见*以引发讨论。 – CAbbott

回答

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

希望这会有所帮助。