【Redis】初探dict字典原理的实现(二)
2014-04-06 11:04
459 查看
时间颇为仓促,以下简单概括一下dict的基础与核心的知识点:
1. 应用范围: redis中字典的应用范围非常广泛; 数据库的键空间, hash类型等都是通过字典来实现的.
2. rehash: 内部维持了两个hashtable, ht[0]为当前所用到的存储ht;
如果正在rehasing, 那么ht[0]会有部分数据迁移到ht[1]; 如果rehash完成, ht[1]将会成为ht[0], 而新的ht[1]将重新初始化;
rehash是自动进行的, 如果填充率过高(即节点数量比可用bucket多得多时)而超过预设值时,将会进行reash;
rehash过程是分步而不是一次来完成的,可以有效减少阻塞时长.
3. resize: 体积缩小的规则与rehash是类似的,最大不同之处是resize是需要程序手动调起的, 而rehash可以自动进行.
4. 安全迭代器与非安全迭代器: 非安全迭代器只能进行Get等读的操作, 而安全迭代器则可以进行iterator支持的任何操作.
由于dict结构中保存了safe iterators的数量,如果数量不为0, 是不能进行下一步的rehash的; 因此安全迭代器的存在保证了遍历数据的准确性;
在非安全迭代器的迭代过程中, 会通过fingerprint方法来校验iterator在初始化与释放时字典的hash值是否一致; 如果不一致说明迭代过程中发生了非法操作.
5. 字典中的hash表通过链地址法来解决键的冲突问题.
1. 应用范围: redis中字典的应用范围非常广泛; 数据库的键空间, hash类型等都是通过字典来实现的.
2. rehash: 内部维持了两个hashtable, ht[0]为当前所用到的存储ht;
如果正在rehasing, 那么ht[0]会有部分数据迁移到ht[1]; 如果rehash完成, ht[1]将会成为ht[0], 而新的ht[1]将重新初始化;
rehash是自动进行的, 如果填充率过高(即节点数量比可用bucket多得多时)而超过预设值时,将会进行reash;
rehash过程是分步而不是一次来完成的,可以有效减少阻塞时长.
3. resize: 体积缩小的规则与rehash是类似的,最大不同之处是resize是需要程序手动调起的, 而rehash可以自动进行.
4. 安全迭代器与非安全迭代器: 非安全迭代器只能进行Get等读的操作, 而安全迭代器则可以进行iterator支持的任何操作.
由于dict结构中保存了safe iterators的数量,如果数量不为0, 是不能进行下一步的rehash的; 因此安全迭代器的存在保证了遍历数据的准确性;
在非安全迭代器的迭代过程中, 会通过fingerprint方法来校验iterator在初始化与释放时字典的hash值是否一致; 如果不一致说明迭代过程中发生了非法操作.
5. 字典中的hash表通过链地址法来解决键的冲突问题.
相关文章推荐
- 【Redis】初探dict字典原理的实现(一)
- Redis源码阅读笔记(2)——字典(Map)实现原理
- 结合redis设计与实现的redis源码学习-4-dict(字典)
- Redis实现原理(2)--字典
- redis:字典实现及rehash原理
- redis源码分析 dict字典的实现和内部应用
- redis:string类型的原理及实现
- [转]Redis有序集内部实现原理分析(二)
- 基于cookie-redis实现单点登录的原理浅谈
- 【Redis基本数据结构】字典实现
- Redis设计与实现 (三): 字典
- iOS 字典实现原理
- Redis实现原理:消息循环、阻塞和事务
- python的整数字符串列表字典对象的实现原理
- 初探编译器static、const之实现原理(转)
- 深入redis内部--字典实现
- Redis复制实现原理
- redis学习笔记(3)---字典dict
- 深入redis内部--字典实现(未完成)
- 初探浏览器缓存实现原理 --提高性能