HTTP缓存如何存储其请求?是否有用于缓存请求的常用协议,或者每个实现都有自己的缓存方法?
EDIT :这是指一旦确定了缓存后,服务器如何物理存储缓存的请求。
我在浏览某些HTTP缓存实现(例如polipo)的功能时,发现它们将(至少)一部分缓存存储在本地文件系统中,但后来发现nginx缓存了文件/文件内容(意味着比将现金请求存储在文件系统中,有一种更有效的方法来访问现金请求。
我正在研究可能的想法,并尝试实现此方法:
Hash request message -> store in a AVL -> access later using the hash value
这样,通过AVL搜索以查看请求是否已被处理过就更加简单有效。 AVL树节点有一个指向请求内容的指针,这样它们就保留在主内存中。
我将其用作哈希函数:
static int hash( int size, request_t* bst_l) {
unsigned long int hashval;
int i = 0;
// Convert our string to an integer
while( hashval < ULONG_MAX && i < strlen( bst_l->MSG ) ) {
hashval = hashval << 8;
hashval += bst_l->MSG[ i ];
i++;
}
return hashval % size;
}
其中size是AVL树的大小。
因此,我希望每个唯一消息都具有唯一的哈希值。虽然我不断为不同的请求获得相似的哈希值。这是因为(hashval%size)行吗?
就可伸缩性和效率而言,上述方法是否是一种好的方法?如果是,哈希函数是否正确匹配它?还是有一种更常见的哈希请求方法?
答案 0 :(得分:2)
要回答您的问题:
HTTP缓存如何存储其请求?
这完全取决于客户。确保您遵守高速缓存头。有关更多信息,请参见本文:https://www.keycdn.com/blog/http-cache-headers
这是因为(hashval%size)行吗?
是的,它只给您size
的可能性。
就可伸缩性和效率而言,上述方法是否是一种好的方法?如果是,哈希函数是否正确匹配它?还是有一种更常见的哈希请求方法?
不,按照您的说法,它似乎不起作用。请参阅此答案以获取正确的实现:
https://stackoverflow.com/a/7666577/2416958
服务器端:
由服务器决定。通常也可以通过各种方式来完成。他们中的许多人使用哈希和内存存储。但这与典型的http不相关;这是服务器实现。例如可以为reddis。
散列(服务器)通常基于以下两者之一生成:调用网址或与其相关的域。可以是自定义字符串,可以对其进行哈希处理以快速访问。
“最有效的方法”;这取决于。 我知道,这是一个无聊的答案。至于速度;内存中的优化结构将是将数据流传输到客户端的最快方法。但它通常占用最大的内存。因此,总有几件事情要考虑。
答案 1 :(得分:1)
这是因为
(hashval % size)
行吗?
不,当然,取模除法会增加发生碰撞的可能性,但是即使不使用它,您也可能会遇到重复的情况,很难实现完美的哈希值,即使样本是随机的,也很难做到。我建议您找到一个管理冲突的哈希映射实现(哈希表中的每个节点都存储指向下一个要与字符串进行比较的冲突键的链接)