我想在我的项目中进行一些缓存。
让我的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/