• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

redis源码阅读关于字典的一点补充

redis 海叔叔 4年前 (2021-08-28) 26次浏览 已收录 0个评论

首先,redis的数据库就是使用字典来作为底层实现的。除了用来表示数据库之外,字典还是哈希键的底层实现之一。
之前的文章其实已经讲了大部分的哈希表的实现,但是这边还是想写一点个人认为比较重要的东西。
1. 哈希表中是使用单链表的方式来解决键的冲突的
2. 当哈希表作为字典的一种实现的时候,会有一个dictType类型的指针,这里面存放着一组用于操作特定类型键值对的函数,也是比较类似linux当中驱动的写法,具体如下

typedef struct dict {
    dictType *type;
    void *privdata;
    dictht ht[2];
    long rehashidx; /* rehashing not in progress if rehashidx == -1 */
    unsigned long iterators; /* number of iterators currently running */
} dict;
typedef struct dictType {
    uint64_t (*hashFunction)(const void *key);
    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;

3. 哈希表的扩展与收缩:1)如果服务器没有执行BGSAVE或者BGREWRITEAOF命令,且哈希表的负载因子大于等于1;2)服务器正在执行BGSAVE或者BGREWRITEAOF命令,且哈希表的负载因子大于等于5;3)当哈希表的负载因子小于0.1时,程序自动开始对哈希表执行收缩操作。
4. 为了避免rehash对服务器的性能造成影响,服务器不是一次性将ht[0]里面的所有键值对全部rehash到ht[1],而是分多次、渐进式的进行的,在此期间,rehashindex会保持>=0,如果完毕或不进行rehash,该值为-1.在rehash期间,任何对字典的操作都会在两个哈希表上执行,先从0表开始,之后1表。
字典的api如下所示

函数 作用
dictCreate 创建一个新的字典
dictAdd 将给定的键值对添加到字典里面
dictReplace 将给定的键值对添加到字典里面,如果键已经存在于字典,那么用新值取代原有的值
dictFetchValue 返回给定的键的值
dictGetRandomKey 从字典中随机返回一个键值对
dictDelete 从字典中删除给定键所对应的键值对
dictRelease 释放给定字典,以及字典中包含的所有键值对

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:redis源码阅读关于字典的一点补充
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址