接上一章数据结构与对象的大章节
数据结构与对象——链表:
链表的数据结构是怎样的不需要仔细讲解,在Redis中当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时,Redis会使用链表作为底层实现。Redis中采用的双端,无环的链表结构,内部提供了实现与API,详情可以自己查阅资料。
数据结构与对象——字典:
直接说字典可能有一些后来学习的同学不是很清楚,其实就是关联数组或者映射(map),是一种保存键值对的Key-Value的抽象数据结构。底层使用的哈希表结构结构问题不详细解释哈希算法,解决键冲突,rehash,哈希表的扩展和收缩,渐进式rehash
哈希算法:
目前Redis使用的是MurmurHash2算法来计算哈希值,目前算法更新到了MurmurHash3了,但是还未使用在目前的Redis中,如果希望看算法的可以看看这个网页:https://github.com/aappleby/smhasher 来查看
解决键冲突:
Redis采用的是链地址值法来解决键冲突,每个哈希表节点上都有一个next的指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一索引下的多个节点就用链表链接起来,这样就解决了键冲突问题。
rehash:
准确来说再哈希法也是可以解决哈希冲突而存在的,但是在Redis中我们使用rehash时是对哈希表扩展和收缩后进行的,为了防止空间的不足和浪费。
哈希表的扩展和收缩:
记住三个负载因子,第一个当不执行BGSAVE或者BGREWRITEAOF方法的时候负载因子是1进行扩展;第二个当执行BGSAVE或者BGREWRITEAOF的时候负载因子是5进行扩展;第三个当负载因子是0.1的时候进行收缩
渐进式rehash:
当需要使用rehash的时候,在Redis中有两个空间一个是扩展前正在使用的,另外一个是扩展后的,使用渐进式rehash的时候在线程空闲阶段将扩展前的数据逐步复制到扩展后的空间中,复制执行后,扩展前空间的数据会被删除,当未空闲时进行等待,分多次进行rehash操作,使程序不用阻塞的异步进行,当在使用渐进式rehash期间字典执行delete,find,update的操作的时候,会先去扩展前的空间去找,如果没找到,然后再去扩展后的空间去找这个键值。