【问题标题】:in-memory cache design using OO concept使用OO概念的内存缓存设计
【发布时间】:2011-07-08 06:19:55
【问题描述】:

什么是内存缓存?我在网上找不到太多关于它的信息。

事实上,我被要求使用 C++ 设计一个基于 OO 概念的内存缓存,但只是不知道如何开始。任何建议将不胜感激。

【问题讨论】:

  • 没有更多细节,今天是不可能的。他们可能在谈论记忆,或者可能是磁盘缓存,或者......

标签: c++ class memory-management operating-system oop


【解决方案1】:

这取决于上下文,但通常,内存缓存会存储一些值,以便以后可以检索它,而不是创建新对象。这最常与数据库结合使用——或者实际上是任何构建/检索对象的应用程序昂贵

对于一个简单的内存缓存,想象一下下面的虚拟类(它违反了大量的最佳实践,所以不要复制它!):

class Integer {
    int value;

public:

    Integer(int value) : value(value) {
        sleep(1000); // Simulates an expensive constructor
    }
};

现在假设您需要创建此类的实例:

Integer one(1);
Integer two(2);
// etc.

...但稍后(以另一种方法)也许您需要创建 一个新的 2 的实例:

Integer two(2);

这很贵。如果您可以回收旧值怎么办?使用构造函数,这是不可能的,但使用工厂方法我们可以轻松地做到这一点:

class Integer {
    int value;

    static std::map<int, Integer> cache;

    Integer(int value) : value(value) {
        sleep(1000); // Simulates an expensive constructor
    }

    friend Integer make_int(int);
};

Integer make_int(int value) {
    std::map<int, Integer>::iterator i = Integer::cache.find(value);
    if (i != Integer::cache.end())
        return i->second;

    Integer ret = Integer(value);
    Integer::cache[value] = ret;
    return ret;
}

现在我们可以使用make_int 来创建或检索一个整数。每个值只会被创建一次:

Integer one = make_int(1);
Integer two = make_int(2);
Integer other = make_int(2); // Recycles instance from above.

【讨论】:

  • 返回 i->second;这是什么意思?
  • 我明白了。谢谢
【解决方案2】:

memcached 有一个C++ API,可能值得一看,看看它是否满足您的需求:

免费和开源、高性能、分布式内存对象缓存系统,本质上是通用的,但旨在通过减轻数据库负载来加速动态 Web 应用程序。

Memcached 是内存中的键值对 存储小块任意 结果中的数据(字符串、对象) 数据库调用、API 调用或页面 渲染。

【讨论】:

    【解决方案3】:

    内存缓存用于存储通常存储在外部的内容,例如数据库记录、HTTP 请求或文件内容。通常,您将维护一个 LRU 对象列表。这很容易管理,因为您只需在收到请求时将对象移动到列表的开头,并在需要添加新对象时删除列表中的最后一个对象。显然,您可以增加很多复杂性来调整此行为,但这是基本算法。

    您可能需要“通读”缓存。也就是说,程序总是向缓存询问它需要的对象,如果缓存中不存在它,则由缓存来获取它。这样,它简化了编程,因为应用程序不必去两个不同的地方来获取一个对象。如果您可以修改已经负责读取对象的现有模块(例如,DAO),它还可以不可见地添加缓存。

    【讨论】:

      猜你喜欢
      • 2013-11-24
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      相关资源
      最近更新 更多