c++ - 缓存多个 key 哈希

标签 c++ c caching data-structures stl

我想在我的项目中进行一些缓存。

让我的API是int foo(int a, float b, float c, int d, char e)

现在在我的项目中,有很多对上述耗时 API 的调用,其中包含 a、b、c、d 和 e 的重复值。现在我想用这些参数作为键来存储这个函数的返回值。

假设我的调用顺序是

foo(23, 3.45, 4.5, 90, 'd') // returns 1000, so I need to store it in cache as (23,3.45, 4.5, 90, 'd')->1000

foo(30, 1.2, 3.5, 100, 'e') // returns 2000, so I need to store it in cache as (30, 1.2, 3.5, 100, 'e')->2000

foo(23, 3.45, 4.5, 90, 'd') // No need to call this API, I just check in my cache value associated with    
//(23, 3.45, 4.5, 90, 'd'), which is already stored as 1000

在 C++ 中实现上述的最佳策略应该是什么?哪种数据结构最适合制作缓存表?

最佳答案

一个要点:缓存很困难。

人们常常认为缓存可以解决所有问题,但他们忘记考虑缓存带来的问题。非托管缓存只不过是巨大的内存泄漏。值得注意的两个策略:

  • 大小限制:每当缓存已满时,添加新条目会导致另一个条目被逐出(因此,您需要一个方案来决定何时逐出条目)
  • 时间限制:条目在经过一定时间后被刷新

通常,当我们听到缓存时,我们会想到 LRU(最近最少使用)缓存。这些缓存受到大小的限制,当缓存已满时,最近最少使用的条目将被逐出。 注意:可能会导致多线程争用,因为只读访问实际上意味着修改值

这样的缓存是通过两个元素实现的:

  • (键 -> 值)映射,使用树或 HashMap
  • 优先级列表,在节点内交错以提高效率

如果你走这条路,我建议使用 Boost.MultiIndex 库。有一个例子 MRU implementation这与您的需求非常相似。

关于c++ - 缓存多个 key 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6145965/

相关文章:

c++ - 将私有(private)字符串声明为引用有什么不同吗?

c++ - 如何在 C++ 多平台中将 (char *) 从 ISO-8859-1 转换为 UTF-8?

c - Gtk 绘制位图

c - 如何正确解决 C 中的 memset() 函数 MISRA 错误?

caching - 清除 System.Net.WebClient DNS 缓存

C++一般如何将成员函数转换为独立函数(用作函数参数)?

c++ - 将对象与应该等于 NULL 的 NULL 进行比较时出现段错误?

c++ - 修改 std::set 的元素时会发生什么?

php - 你怎么会忘记 Laravel 中缓存的 Eloquent 模型?

caching - 限制 Dropbox 缓存大小