【发布时间】: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 < ULONG_MAX)将始终为真,除非hashval == ULONG_MAX。唯一不会的方法是请求字符串中有 4 个连续的0xff字节。所以在大多数情况下,您的哈希码只是请求字符串的最后 4 个字符。 -
谢谢。哈希值确实代表了字符串的最后几个字节。我应该只对请求行进行哈希处理。
-
不管你散列什么,你都应该使用一个好的hash function..例如Jenkins hash就很好了。