redis数据结构存储Dict设计细节(redis的设计与实现笔记)
说到redis的Dict(字典),虽说算法上跟市面上一般的Dict实现没有什么区别,但是redis的Dict有2个特殊的地方那就是它的rehash(重新散列)和它的字典节点单向链表。
以下是dict用到的结构:
typedef struct dictEntry {//字典的节点
void *key;
union {//使用的联合体
void *val;
uint64_t u64;//这两个参数很有用
int64_t s64;
} v;
struct dictEntry *next;//下一个节点指针
} dictEntry;
typedef struct dictType {
unsigned int (*hashFunction)(const void *key); //hash函数指针
void *(*keyDup)(void *privdata, const void *key); //键复制函数指针
void *(*valDup)(void *privdata, const void *obj); //值复制函数指针
int (*keyCompare)(void *privdata, const void *key1, const void *key2); //键比较函数指针
void (*keyDestructor)(void *privdata, void *key); //键构造函数指针
void (*valDestructor)(void *privdata, void *obj); //值构造函数指针
} dictType;
/* This is our hash table structure. Every dictionary has two of this as we
* implement incremental rehashing, for the old to the new table. */
typedef struct dictht { //字典hash table
dictEntry **table;//可以看做字典数组,俗称桶bucket
unsigned long size; //指针数组的大小,即桶的层数
unsigned long sizemask;
unsigned long used; //字典中当前的节点数目
} dictht;
typedef struct dict {
dictType *type;
void *privdata; //私有数据
dictht ht[]; //两个hash table
int rehashidx; /* rehashing not in progress if rehashidx == -1 */ //rehash 索引
int iterators; /* number of iterators currently running */ //当前该字典迭代器个数
} dict;
由于楼主算法能力有限:所以对哈希算法没有太深的了解,所以在这里算法就不详写了,大家有兴趣可以百度。
当运用哈希算法计算出 k0的索引 ,redis就会插入到指定的位置

当k2和k1出现计算出键索引相同的情况下,这时候redis的dictEntry(字典节点)有一个next属性(单项链表),redis会把冲突键索引的元素排到后插入数据的前面,从而解决了这个问题

现在如果在插入2条元素,此时数据量已经超过dict的负载了,redis就会启用rehash,虽然是rehash操作但是redis是采用了渐进式操作,并不是一下子内存不够用了 就直接操作内存,然后全部转移数据,这样会导致操作很耗时,redis考虑到了这一点,然后
先把ht[1]另一张dict结构中扩容一个数量为ht[0].used*2的dictEntry数组,然后把2条数据通过哈希算法加入到这个数组中。

然后把上面的元素一个个异步渐渐移动到下面的数组中,在这个过程中如果客户端去操作元素时,如果在ht[0]中检查找不到建,就会去检查ht[1]中是否有指定的键,从而不影响数据的使用,而且可以避免一次性操作rehash带来的耗时问题,最后reshash完成了,就直接把ht[1]和ht[0]切换位置并且清空弃用的哈希节点数组,从而完成所有操作。


redis数据结构存储Dict设计细节(redis的设计与实现笔记)的更多相关文章
- Redis 数据结构之dict(2)
本文及后续文章,Redis版本均是v3.2.8 上篇文章<Redis 数据结构之dict>,我们对dict的结构有了大致的印象.此篇文章对dict是如何维护数据结构的做个详细的理解. 老规 ...
- redis数据结构存储SDS设计细节(redis的设计与实现笔记)
redis虽说是用C语言开发的,但是redis考虑了性能.安全性.效率性.功能等要,redis底层存储字符串实现,自己实现了名为简单动态字符串(Simple dynamic string)简称SDS的 ...
- Redis 数据结构之dict
上篇文章<Redis数据结构概述>中,了解了常用数据结构.我们知道Redis以高效的方式实现了多种数据结构,因此把Redis看做为数据结构服务器也未尝不可.研究Redis的数据结构和正确. ...
- redis数据结构存储Linked List设计细节(redis的设计与实现笔记)
redis里拥有一个灵活扩展且获取表头表尾复杂度为O(1)的双端列表,分为list和listNode2部分组成. list: typedef struct list {//链表 listNode *h ...
- Redis数据结构和使用场景,redis内存淘汰策略
什么样的数据适合放入Redis? sql执行耗时特别久,且结果不频繁变动的数据,适合放入Redis. Redis是单线程的,为什么会这么快? 纯内存操作 单线程操作,避免频繁的上下文切换 采用了非阻塞 ...
- redis学习(二) redis数据结构介绍以及常用命令
redis数据结构介绍 我们已经知道redis是一个基于key-value数据存储的数据结构数据库,这里的key指的是string类型,而对应的value则可以是多样的数据结构.其中包括下面五种类型: ...
- Redis数据结构—链表与字典
目录 Redis数据结构-链表与字典 链表 Redis链表节点的结构 Redis链表的表示 Redis链表用在哪 字典 Redis字典结构总览 Redis字典结构分解 哈希算法 解决键冲突 rehas ...
- 选择合适Redis数据结构,减少80%的内存占用
redis作为目前最流行的nosql缓存数据库,凭借其优异的性能.丰富的数据结构已成为大部分场景下首选的缓存工具. 由于redis是一个纯内存的数据库,在存放大量数据时,内存的占用将会非常可观.那么在 ...
- Redis数据结构
Redis数据结构 Redis数据结构详解(一) 前言 Redis和Memcached最大的区别,Redis 除啦支持数据持久化之外,还支持更多的数据类型而不仅仅是简单key-value结构的数据 ...
随机推荐
- TODO:一不顺眼就换字体Go之代码篇
TODO:一不顺眼就换字体Go之代码篇 image包实现了一个基本的2D图像库,该包中包含基本的接口叫做image,这个里面包含color,这个将在image/color中描述:新增字体font,进行 ...
- C# 给Word文档添加内容控件
C# 给Word文档添加内容控件 在MS Word中,我们可以通过内容控件来向word文档中插入预先定义好的模块,指定模块的内容格式(如图片.日期.列表或格式化的文本等),从而创建一个结构化的word ...
- C# VLCPlayer视频播放器(附源码)
VLCPlayer视频播放器. 支持本地播放,支持网络URL.支持全屏,截图. 基于VLCPlayer. 附带基本代码. 下载地址:http://pan.baidu.com/s/1nvjNvID
- agsXMPP
agsXMPP使用 agsXMPP中的例子已经有注册.登录.添加好友.接收好友添加请求.发送消息.接收消息等功能. 修改用户密码 登录后可用以下方法修改密码 IQ iq = new IQ(IqType ...
- Entity Framework 教程——概述
Entity Framework 基础 本教材将手把手教你使用entity framework,我们将使用entity framework 6.0和visual studio 2012. 以下表格是e ...
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- 【转载】保哥 釐清 CLR、.NET、C#、Visual Studio、ASP.NET 各版本之間的關係
我常常不仅仅逛 博客园,还会去找国外,特别是台湾的技术部落格,发现好的文章,我便会收录,今天我转载或者全文复制,在Google 博客园,一位叫保哥, 釐清 CLR..NET.C#.Visual Stu ...
- 随机记录工作中常见的sql用法错误(一)
没事开始写博客,留下以前工作中常用的笔记,内容不全或者需要补充的可以留言,我只写我常用的. 网上很多类似动软生成器的小工具,这类工具虽然在表关系复杂的时候没什么软用,但是在一些简单的表结构关系还是很方 ...
- PHP多图片上传实例demo
upload.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- java重载与覆写
很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参 ...