【问题标题】:How do HTTP caches STORE cached requests?HTTP 如何缓存 STORE 缓存的请求?
【发布时间】:2019-11-08 17:49:20
【问题描述】:

HTTP 缓存如何存储它们的请求?是否有缓存请求的常用协议,或者每个实现都有自己的缓存方法?

编辑:我的意思是,一旦决定缓存,服务器如何物理存储缓存的请求。

我正在查看一些 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) 行吗?

上述方法在可扩展性和效率方面是否良好?如果是这样,哈希函数是否正确匹配?还是有更常用的哈希请求方法?

【问题讨论】:

  • 您的散列函数将始终满足请求的全部长度。 (hashval &lt; ULONG_MAX)始终为真,除非hashval == ULONG_MAX。唯一不会的方法是请求字符串中有 4 个连续的 0xff 字节。所以在大多数情况下,您的哈希码只是请求字符串的最后 4 个字符。
  • 谢谢。哈希值确实代表了字符串的最后几个字节。我应该只对请求行进行哈希处理。
  • 不管你散列什么,你都应该使用一个好的hash function..例如Jenkins hash就很好了。

标签: c http hash


【解决方案1】:

回答您的问题:

HTTP 缓存如何存储它们的请求?

这完全取决于客户。确保您尊重缓存标头。更多信息请看这篇文章:https://www.keycdn.com/blog/http-cache-headers

这是因为 (hashval % size) 行吗?

嗯,是的,它只会给你size 的可能性。

上述方法在可扩展性和效率方面是否良好?如果是这样,哈希函数是否正确匹配?还是有更常用的哈希请求方法?

不,它似乎不像你所说的那样工作。请参阅此答案以获得正确的实施:

https://stackoverflow.com/a/7666577/2416958


来自 cmets:

服务器端:

这取决于服务器。这通常也以各种方式完成;他们中的许多人使用哈希和内存存储。但这不是典型的 http 相关;这是一个服务器实现。例如可以是reddis

哈希(服务器)通常是基于其中一个生成的;调用 url,或与之相关的域。可以是自定义字符串,为快速访问而散列。


至于“最有效的方法”;这取决于。 我知道,这是一个无聊的答案。至于速度;内存中的优化结构将是将数据流式传输到客户端的最快方式。但它通常占用最大的内存量。所以总有一些事情需要考虑。

【讨论】:

  • 我的问题可能措辞不当。我的意思是他们如何物理存储缓存的请求。
  • 不过,这取决于客户。有些放在磁盘上,有些只放在内存中。有些结构化,有些没有。还是我还是误会了?
  • 当然,是否缓存的决定受请求消息中的头部影响。我的问题是,如果您决定缓存,存储请求的最有效方式是什么?
  • 如果您指的是服务器;这取决于服务器。这通常也以各种方式完成;他们中的许多人使用哈希和内存存储。但这不是典型的 http 相关;这是一个服务器实现。例如可以是reddis
  • 哈希(服务器)通常是基于其中一个生成的;调用 url,或与之相关的域。可以是自定义字符串,为快速访问而散列。
【解决方案2】:

这是因为(hashval % size) 行吗?

不,当然,模除法会增加冲突的可能性,但即使不使用它,你也会得到重复的情况,完美的哈希是很难实现的,更不用说当样本是随机的时候是不可能的。我建议你找到一个管理冲突的 hashmap 实现(哈希表中的每个节点都存储一个指向下一个冲突键的链接,你必须与你的字符串进行比较)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2016-06-29
    • 1970-01-01
    • 2017-08-07
    • 2018-03-16
    相关资源
    最近更新 更多