大家好 我有树节点。节点由TCP API请求响应值构成。 为了减少请求,我想在缓存结构中表示树,每次都要调用TCP请求 它会先检查缓存。 最好的方法是什么?我的意思是树缓存部分,在我的例子中我使用的是Qt和C ++。
答案 0 :(得分:1)
您可以使用std:map<TCPRequest, TCPResponse>
来实现此目的。您的请求和响应可能是字符串,在这种情况下,可能会减少到std:map<std::string, std::string>
。如果没有,您需要确保TCPRequest
类支持operator<
以允许对地图进行二进制搜索。
您的代码可能类似于
#include <map>
std::map<TCPRequest, TCPResponse> responseCache;
typedef std::map<TCPRequest, TCPResponse>::const_iterator cacheCIterator;
TCPRequest nextRequest;
cacheCIterator iter = responseCache.find(nextRequest);
if (iter != responseCache.end())
{
return iter->second; // found cached response
}
else
{
// issue the request
TCPResponse response = issueRequest(nextRequest);
//save the response
responseCache[nextRequest] = response;
return response;
}
您还需要考虑缓存过期,除非您的流量足够小,您只能缓存所有响应。在某些时候,您希望从地图中erase()
TCPResponse
个对象,可能通过保留一个单独的结构来告诉您哪个响应最近最少使用(LRU)。
考虑到这一点,可以在int
对象中使用某种唯一标识符(单调增加的TCPResponse
可用作完整对象的代理,允许您识别缓存使用int
s而不是完整的类实例进行LRU响应。您仍需要进行完整的TCPRequest
比较,以确保缓存按预期工作。
答案 1 :(得分:0)
如果未完成的请求数量很大,您可能需要考虑哈希映射。请参阅QT库中的QHash或std :: hash_map(取决于您使用的STL的风格)。