博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis数据结构之字典
阅读量:4170 次
发布时间:2019-05-26

本文共 1517 字,大约阅读时间需要 5 分钟。

字典是用于保存键值对的抽象数据结构,对数据库的增删改查都是构建在对字典的操作上。字典是哈希键的底层实现值一,当一个哈希键包含的键值对较多或键值对中的元素是比较长的字符串时,Redis就使用字典作为哈希键,哈希表是字典的底层实现。

哈希表
typedef struct dictht{
//哈希表数组 dicEntry **table; //哈希表大小 unsigned long size; //哈希表大小掩码,由于计算索引值 //值为size-1 unsigned long sizemask; //哈希表已有节点的数量 unsigned long used; } dictht;

table是数组,其中每个元素都是一个键值对(dictEntry)。

size记录哈希表大小
used记录哈希表已有键值对的数量
sizemask属性值总等于size-1,这个属性和哈希值决定键的数组存储位置。

哈希表节点
typedef struct dictEntry{
//键 void *key; //值 union{
void *val; uint64_tu64; int64_ts64; } v; //下个哈希表节点,形成链表 struct dictEntry *next; }

key为键值对的键,v为值(类型可谓指针,uint64_t整数或int64_t)

next指向另一个哈希表节点的指针,该指针将多个哈希值相同的键值对连在一起,解决键冲突的问题。

哈希表例子:

在这里插入图片描述

字典

typedef struct dict {
// 类型特定函数 dictType *type; // 私有数据 void *privdata; // 哈希表 dictht ht[2]; //rehash索引 //当rehash不进行时,值为-1 int trehashidx; } dict

type属性是指向dictType结构的指针,每个dictType结构保存一些用于操作特定类型键值对的函数,Redis为不同字典设置不同的函数

privdata属性保存需传给那些函数的可选参数

typedef struct dictType {
//计算哈希值的函数 unsigned int (*hashFunction)(const void *key); //复制键的函数 void *(*valDup)(void *privdata,const void *key1, const void *key2); //复制值的函数 void *(*valDip)(void *privdata,const void *key1,const void *key2); .... }

ht数组包含了两个哈希表,字典使用ht[0],ht[1]在哈希表rehash时使用。

出ht[1]之外,rehashidx也跟rehash有关,记录了rehash的进度,如果没有rehash,那么其值为-1。

转载地址:http://eykai.baihongyu.com/

你可能感兴趣的文章
TCP-IP详解卷1:协议 学习笔记(5) RARP ICMP
查看>>
Java核心技术 卷I 基础知识 学习笔记(3)
查看>>
TCP-IP详解卷1:协议 学习笔记(6) Ping
查看>>
Java核心技术 卷I 基础知识 学习笔记(4)
查看>>
Java核心技术 卷I 基础知识 学习笔记(5)
查看>>
Java核心技术 卷I 基础知识 学习笔记(6)
查看>>
微服务架构与实践 学习笔记(1)
查看>>
Java核心技术 卷I 基础知识 学习笔记(7)
查看>>
IDEA使用之让maven项目自动依赖jar包
查看>>
Java核心技术 卷I 基础知识 学习笔记(8)
查看>>
Java核心技术 卷I 基础知识 学习笔记(9)
查看>>
IDEA Java serialVersionUID生成
查看>>
Intellij IDEA 创建资源文件夹 source folder
查看>>
Java核心技术卷2 高级特性 学习笔记(1)
查看>>
Java核心技术卷2 高级特性 学习笔记(4)
查看>>
最大乘积
查看>>
最长公共子串
查看>>
codeforces831c 思维
查看>>
CodeForces - 785C Anton and Fairy Tale
查看>>
CodeForces - 831D Office Keys
查看>>