hash - 为什么 Redis dict 中的负载因子设置为 1

标签 hash redis hashmap

众所周知,在哈希表中,负载因子对于控制冲突很重要。

In Java/HashMap, the default load factor is 0.75, And in CPython/dict, the load factor is set to 2 / 3

但是,在 Redis/dict 中,它是 1.0 (启用 dict_can_resize 时),为什么?

/* If we reached the 1:1 ratio, and we are allowed to resize the hash
 * table (global setting) or we should avoid it but the ratio between
 * elements/buckets is over the "safe" threshold, we resize doubling
 * the number of buckets. */
if (d->ht[0].used >= d->ht[0].size &&
    (dict_can_resize ||
     d->ht[0].used/d->ht[0].size > dict_force_resize_ratio))
{
    return dictExpand(d, d->ht[0].used*2);
}

在我看来,负载系数应该小于 1。由于可能的高冲突率,高负载因子可能会增加查找成本。

最佳答案

高负载系数也更节省内存。 Redis 是一个内存数据库,它需要内存高效。我认为 Redis 的作者做了一些基准测试来平衡内存使用和性能。

关于hash - 为什么 Redis dict 中的负载因子设置为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54810023/

相关文章:

lua - 在 redis 中检查特定值的键

hashmap - 尝试从 RwLock 返回引用, "borrowed value does not live long enough"错误

java - 在包含字符串和 double 的外部文本文件上使用扫描仪

java - 如果将hashmap放入容量超过容量会怎样

ruby-on-rails - rails : How to sort/re-order an OrderedHash

ruby-on-rails - 递归修改嵌套哈希中的值

php - 将 php session 移动到 redis。有可能不丢失现有 session 数据吗?

c# - byte[] 数组上的 GetHashCode()

hash - Google URL Shortener 如何在没有冲突的情况下生成 5 位哈希

node.js - 在上一个作业完成之前不要处理下一个作业(BullJS/Redis)?