Redis中hashtable内部实现的细节
针对上图,对于四个知识点进行讲解,本文参考了其他博客的文章,有的知识点需要看详细的博客,我会列出博客的链接。上面四个知识点应该涵盖redis涉及到的所有细节,如何还有,请大家多多提出,一起探讨。。。
博客链接:http://www.hoterran.info/redis_dict
一、hashtable的内存结构
总结就是:两个数组链表的数据结构,请看网友画的图:
问题提出:
1、dict 包含了2个dictht hashtable ht[0], ht[1],为什么要包含两个hashtable?
这是做的目的扩容即rehash所带来的性能问题,采取了平稳的扩容机制,而不像java中的hashmap扩容是一次性的rehash,这样带来了很大的性能问题
2、为什么第二个hashtable是第一个hashtable的两倍呢?
3、为什么要rehash?
随着key不断的添加,bucket下的单链表越来越长,查找、删除效率越来越低,需要对ht进行expand,增加bucket个数,让链表的长度减少。bucket数量的增多,原有bucket的key需要迁移到新的bucket上,于是有了rehash的这个过程
4、什么时候rehash?
对于数据是如何添加、修改、删除、查找请看第四部分
二、zipmap
问题:
1、为什么使用zipmap?
保证在hashtable刚创建以及元素较少时,用更少的内存来存储,同时对查询的效率也不会受太大的影响,
而当hashtable元素不超过254个元素就使用,zipmap存储否则就转向hashtable存储。
先来看一下zipmap提供的和存储相关的3个API:
- zipmapNew:创建一个zipmap字符串。zipmap创建时只有2个字节,后面会随着set和delete操作动态扩展和收缩。
- zipmapSet: 加入新的key/value或者修改zipmap中已有key对应的value。
- zipmapDel:从zipmap中删除key/value。
下面给出一段伪代码并分析其内存布局的变化,如下图:
- zipmapNew();
- zipmapSet(key1,value1);
- zipmapSet(key2,value2);
- zipmapSet(key1,value3);
- zipmapDel(key2);
- zipmapSet(key1,value4);
- 大小: 24.6 KB
- 大小: 101 KB
分享到:
相关推荐
#### 四、内部实现细节 - **HashTable**: 内部使用了`Entry`类来表示键值对,并且每个`Entry`都有一个指向下一个`Entry`的引用。`HashTable`通过计算键的哈希码并将其与表大小取模来确定元素的位置。 - **HashMap**...
尽管它们在功能上有很多相似之处,但在实现细节和性能特性上存在显著差异。 #### 二、主要区别 1. **空值支持**: - **HashMap**:允许使用 `null` 键和 `null` 值。 - **HashTable**:不允许使用 `null` 键或 `...
尽管它们有着相似的功能,但在实现细节和应用场景上存在显著差异。接下来,我们将详细探讨`Hashtable`和`HashMap`之间的区别,并分析它们各自的优缺点。 #### 1. 线程安全性 - **Hashtable**: 是线程安全的。`...
### 实现细节与示例 #### 1. 按照插入顺序输出 如果我们希望哈希表能够按照元素的插入顺序进行输出,可以通过扩展`Hashtable`类并使用`ArrayList`来保存键的插入顺序。以下是一个具体的实现例子: ```csharp ...
其次,HashTable内部使用一个C数组来存储“桶”(buckets),每一个桶可以看作是链表的节点。当发生哈希冲突时,即不同的key经过哈希函数映射到同一个数字索引时,这些key会被存储在同一个桶的双向链表中。这种设计...
本文将深入探讨`HashTable`的不同实现细节及其在实际编程中的应用。 1. **哈希表基本原理**: 哈希表是一种使用散列函数将键(Key)映射到数组索引位置的数据结构。当需要存储键值对时,哈希表会计算键的哈希值,...
### ConcurrentHashMap实现细节详解 #### 一、概述 `ConcurrentHashMap`是Java 5引入的一种高性能、线程安全的散列表实现。相较于传统的`HashMap`,`ConcurrentHashMap`能够支持高并发环境下的多线程读写操作。...
...这一变化导致了更高效的内存使用和性能提升。 ...这意味着zval结构体体积变得更小,因为不再需要存储引用计数。...通过深入学习和理解这些内部实现细节,开发者能够更有效地利用PHP7的特性和性能优势。
本资源摘要信息涵盖了 Java 集合框架的基本概念和实现细节,着重介绍了 Java 集合框架中的 HashMap、Hashtable、ArrayList、LinkedList 等常用类,并对比了 Hashtable 和 HashMap 的区别,详细分析了两者在源代码...
在`HashTable.h`头文件中,这些操作的函数原型将被定义,允许用户在不关注内部实现的情况下调用它们。 **C语言实现** `HashTable.c`和`HashTable.cpp`文件包含了哈希表的实现细节。C语言是一种静态类型语言,不...
3. `tiny_hash.inl`: 这通常是一个内联文件,包含模板类的实现细节,这样做可以避免在多个翻译单元中重复定义模板,提高编译效率。 综上所述,这个自定义哈希表的实现重点在于模板的泛型编程、字符串键的支持以及...
本文将详细介绍Java中String和StringBuffer的区别、Java基础知识、ArrayList和Vector的区别、HashMap和Hashtable的区别、char型变量中能否存储一个中文汉字、多线程实现方法、同步实现方法、继承时候类的执行顺序...
两者在哈希表的大小、哈希值的处理以及实现细节上也有所不同,`HashMap`在性能上通常优于`HashTable`。 最后,抽象类和接口是两种不同的多态实现方式。抽象类是一种未完全实现的类,可以包含抽象方法(没有方法体的...
7. **内部类的更多细节**: - 静态内部类:不持有对外部类的引用,可以独立存在,可以通过外部类的类名直接创建。 - 非静态内部类:每个实例都包含一个对外部类的引用,必须在外部类的实例上下文中创建。 8. **...
- `HashMap` 和 `Hashtable`:`Hashtable` 是较旧的实现,基于 `Dictionary` 类,不支持 `null` 键或值且线程安全;`HashMap` 是 `Map` 接口的实现,不保证线程安全,支持 `null` 键和值。 3. `char` 类型存储中文...
**哈希表(HashTable)详解** 哈希表是一种在计算机科学中广泛使用的数据结构,它提供了高效...通过这些练习,你将深化对哈希表的理解,掌握其设计原理及在Java中的实现细节,同时也能提升解决问题和分析性能的能力。
Java笔试是评估应聘者编程能力的重要环节,涵盖了各种基础概念和技术细节。以下是一些Java笔试中常见的问题及其解答,旨在帮助准备参加Java笔试的求职者巩固基础知识。 1. **访问修饰符的区别** - `public`: 可以...
【Java 集合与泛型面试知识点】 ...在面试中,面试官可能还会深入询问这些概念的实现细节、性能影响以及如何在实际项目中合理选择和使用。因此,开发者需要对这些基础概念有深入的理解,并能灵活应用到实践中。
需要注意的是,由于这种做法依赖于内部实现细节,因此可能随着.NET框架版本的升级而失效。如果微软改变了内部实现,上述代码可能需要相应调整。因此,使用这种方法时,应谨慎考虑潜在的维护风险,并尽可能保持代码的...