【问题标题】:Object cache with unlimited # of keys but a limited # of objects具有无限数量的键但有限数量的对象的对象缓存
【发布时间】:2012-03-17 12:10:14
【问题描述】:

我正在寻找一个可以实现以下模式的c#对象缓存库:

  • 缓存用于缓存具有主键的某种类型 T 的对象。示例:一个 Person 类(包含名字、姓氏等),键是 PersonId
  • 缓存可以存储无限数量的键。键的类型为 int 或 long。
  • 但是,缓存只能存储有限的 # 个 T 类型的对象。T 对象占用大量内存,我不能一次在缓存中存储大量此类对象。
  • 在溢出时,缓存可以将对象序列化到数据库或文件等(快速介质),但缓存仍会保留键。

我基本上需要处理的 T 个对象比我可以保存在内存中的要多,我想在将结果保存到数据库之前使用缓存快速检索它们。

所以,我正在考虑使用Proxy 模式并让缓存存储代理对象,这些对象可以获取/序列化我的真实对象。

你知道任何可以与这些模式一起使用的缓存 c# 库吗?我自己也找不到任何东西。

谢谢

【问题讨论】:

  • 到底是什么问题?据我所知,没有内存缓存包。除了你能看到的博客。懒惰的代理是要走的路。还要对缓存项设置过期时间。如果要限制缓存大小,请执行 LRU impl 以驱逐缓存项。
  • 重新表述了这个问题。我希望现在很清楚。
  • 我不明白将 ID 保存在缓存中会有什么帮助。无论如何,您都需要访问数据库来检索实际数据。
  • 如果您需要访问更多的 T,那么您可以保留在内存中,那么您开始听起来像 memcached/memcachedb/RavenDB 就是您正在寻找的那种东西。我认为像 RavenDB 这样的 ORM 几乎肯定会覆盖你的基础。
  • 分布式缓存与内存缓存的区别在于您没有任何网络延迟。但是你还有其他问题。这是一个很大的话题,最好有代码和经验,解决问题。查看内存缓存。

标签: c# caching


【解决方案1】:

您正在寻找的是一个数据库。数据库引擎用于将键表和对象表分开。 (如果您不熟悉该概念,请在网上搜索有关数据库索引、主键等的信息。)它们还用于将键表的页面保存在 RAM 中,并将最近使用的对象保存在 RAM 中。事实上,许多数据库引擎允许您配置您在 RAM 中保留的每个引擎的数量。我认为您应该将 Sqlite 与轻量级 ORM 一起使用(例如 Dapper 或 ServiceStack.OrmLite 或无数其他人之一)。 Sqlite 有一个参数可以关闭磁盘同步,另外两个参数可以调整 RAM 中的数据量。在此处查看信息:http://www.sqlite.org/pragma.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多