【问题标题】:Caching strategies for entities and collections [closed]实体和集合的缓存策略[关闭]
【发布时间】:2023-03-17 21:38:02
【问题描述】:

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

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

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

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

【问题讨论】:

  • 意见问题应该在 Programmers.StackExchange:programmers.stackexchange.com
  • @CAbbott 我认为这个问题符合问题常见问题解答中的指导 - 它涉及“特定的编程问题”并且可以回答。
  • 我会说你不是在问一个“实用的编程问题”,即“我已经写了 X 并且它不起作用”,而是你在征求关于引发讨论的替代方法的意见
  • 我对您如何管理密钥(int id)感兴趣。

标签: .net design-patterns caching architecture scalability


【解决方案1】:

不确定您的问题到底是什么。

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 2013-06-07
    • 1970-01-01
    • 2012-05-13
    • 2010-10-06
    • 1970-01-01
    • 2011-11-23
    • 2010-10-26
    • 1970-01-01
    相关资源
    最近更新 更多