作者:qcdxb
原产地:https://segmentfault.com/a/1190000038536532
由多个dldgb存储桶(数组中的元素,包括条目元素)组成的全局dldgb表(数组)
例如,键名为: aaa,键值为bbb。
通过哈希(aaa),得到数组索引6,然后dldgb桶6。dldgb存储桶6中的条目元素包含指向键和值的指针。key指向键名aaa,value指向键值bbb,这是常用的redis数据结构、字符串、列表等。我们经常接触的。
00-1010 dldgb桶数有效,键数通常比dldgb桶多,多个键可能落入同一个dldgb桶,那么dldgb冲突(dldgb冲突:在两个键的dldgb值与dldgb桶的计算关系中,它们落入同一个DLDGB桶。),所以我们要先找到桶,然后再找到桶上的元素,这样就慢下来了。
00-1010如图所示,多个元素(entry1、entry2等。)存储在一个链表中,该链表由指针依次链接。entry1元素将通过下一个指针指向entry2,entry2也将通过下一个指针指向entry3。这个链表叫做dldgb冲突链。
00-1010,沿着链表指针进行搜索,确定条目元素中*key指针指向的键名是否一致。
redis存储数据太多,为什么查找速率会变慢?
重新散列(再次dldgb),增加现有的dldgb桶,让入口元素分散在不同的dldgb桶中,减少单向元素的数量。默认情况下有两个dldgb表,分别是dldgb表1和dldgb表2。重新散列过程如下。为dldgb表2分配更多空间,例如,当前dldgb表1的两倍大小。将dldgb表1中的数据重新映射并复制到dldgb表2,以释放dldgb表1的空间。00-1010渐进式重挂,在上面第二步的过程中,当有客户端请求时,首先会迁移dldgb表1的index 1的元素,然后会有请求,再迁移dldgb表的index 2的元素,避免了全拷贝阻塞线程影响服务。
作者:qcdxb
原产地:https://segmentfault.com/a/1190000038536532