C++ 基于面向对象的内存缓存设计

C++ 基于面向对象的内存缓存设计,c++,class,memory-management,operating-system,oop,C++,Class,Memory Management,Operating System,Oop,什么是内存缓存?我在网上找不到太多关于它的信息 事实上,我被要求用C++来设计基于OO概念的内存缓存,只是不知道如何启动。任何建议都将不胜感激。这取决于上下文,但通常情况下,内存缓存会存储一些值,以便以后可以检索,而不是创建新对象。这通常与数据库结合使用,或者与构建/检索对象成本高昂的任何应用程序结合使用 对于一个简单的内存缓存,想象一下下面的虚拟类(它违反了大量的最佳实践,所以不要复制它!): 现在假设您需要创建此类的实例: Integer one(1); Integer two(2); //

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


事实上,我被要求用C++来设计基于OO概念的内存缓存,只是不知道如何启动。任何建议都将不胜感激。

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

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

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

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;
}

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

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

有一个功能,值得一看,看看它是否满足您的需要:

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

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


如果没有更多的细节,就不可能有今天。他们可能在谈论记忆,或者可能是磁盘缓存,或者…返回i->second;这是什么意思?我明白了。非常感谢。
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;
}
Integer one = make_int(1);
Integer two = make_int(2);
Integer other = make_int(2); // Recycles instance from above.