什么是内存缓存?我从网上找不到太多关于它的信息。
事实上,我被要求使用C ++设计基于OO概念的内存缓存,但只是不知道如何启动。任何建议将不胜感激。
答案 0 :(得分:5)
这取决于上下文,但通常,内存缓存存储一些值,以便以后可以检索,而不是创建新对象。这通常与数据库一起使用 - 或者实际上任何构建/检索对象昂贵的应用程序。
对于一个简单的内存缓存,想象一下下面的虚拟类(违反了大量的最佳实践,所以不要复制它!):
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.
答案 1 :(得分:0)
内存缓存用于存储通常存储在外部的内容,如数据库记录,HTTP请求或文件内容。通常,您将维护一个LRU对象列表。这很容易管理,因为您需要做的就是在收到请求时将对象移动到列表的头部,并在需要添加新对象时删除列表中的最后一个对象。显然,您可以添加很多复杂性来调整此行为,但这是基本算法。
您可能想要一个“直读”缓存。也就是说,程序总是向缓存询问它所需的对象,如果它不存在于缓存中,则由缓存来获取它。这样,它简化了编程,因为应用程序不必去两个不同的位置来获取对象。如果您可以修改已经负责读取对象的现有模块(例如,DAO),它还可以无形地添加缓存。
答案 2 :(得分:0)