redis数据结构-链表,字典

链表

Redis中的链表为自定义数据结构,主要是C语言中没有定义这样的数据结构,不像Java,python都给你定义好了。其设计上为双向链表,跟其他算法书上的定义一样,并没有加入任何多余的东西。下面简单说明一下链表和链表节点。

链表,链表节点

链表节点:

listNode {
	listNode *prev;
	listNode *next
	void *value;	
}

多个链表节点组成双向链表:
在这里插入图片描述
链表:

list {
  listNode *head;
  listNode *tail;
  unsinged long len
  -------
  -------
}

字典

还是由于C语言中并没有定义这样的数据结构,所以Redis只能自己定义一套。C语言老是要自己造轮子,也不知道是没有这样的库,还是写C的都贼牛。言归正传,Redis 自定义的字典,数据结构的核心还是跟算法书上的一样,不过加入了一些自定义的东西。
字典底层是用哈希表实现的,哈希表由哈希节点组成。我们按哈希节点,哈希表倒过来说

哈希节点

dictEntry{
	dictEntry *next;
	void *key;
	union v;
}

可以看见,这就是一个键值对,同时包含指向下一个哈希节点的指针。指针用来解决哈希冲突(新的键值对要加入已经有元素的的索引处)用的,当出现哈希冲突后,多个节点就通过next这个指针形成单向链表

在这里插入图片描述

哈希表

dictht{
	//哈希表数组
	dictEntry **table;
	unsigned long size;
	//哈希表大小掩码,计算索引用
	unsigned long sizemask;
	unsigned long used;
}

哈希表就是由多个这样的单向链表组成的数组

字典

dict{
	dictht ht[2];
	int trehashidx;
	dictType *type;
	void *privdata;
}
  • ht ,包含两个哈希表h[0],h[1],h[1]用于rehash时使用
  • trehashidx,rehash进度
  • type,一簇操作键值对的函数
  • privdata,函数的可选参数

Redis 使用MumurHash2算法来计算键的哈希值,再通过哈希值与dictht.sizemask(dictht.size-1)进行与运算得出所以值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值