redis键值对用什么构造组织?
一个全局哈希表(数组),由多个哈希桶(数组上的元素,蕴含entry元素)组成
比方,键名: aaa,键值 : bbb
通过hash(aaa), 失去数组下标6,则哈希桶6。哈希桶6中的entry元素蕴含key和value指针, key指向键名aaa, value指向键值bbb, 而bbb就是咱们平时业务接触过的罕用redis数据结构,string,list等
redis存储数据太多,为什么查找速率会变慢?
哈希桶数量无效,key通常会比哈希桶多,多个key可能落在同一哈希桶,则哈希抵触(哈希抵触:两个key的哈希值和哈希桶的计算关系中,落在同一个哈希桶。),所以先要找到桶,再找桶上的元素,所以变慢了
同一个哈希桶的元素是如何存储的?
如图,同一个哈希桶的多个元素(entry1,entry2等)以链表保留,顺次用指针链接,entry1 元素会通过一个next指针指向 entry2,同样,entry2 也会通过next指针指向 entry3,此链表称为哈希抵触链
找到哈希桶后,redis如何查找到对应元素?
沿着链表指针指向查找,判断entry元素中*key指针指向的键名是否统一
当数据越来越多,哈希抵触链太长,查找元素变慢怎么办?
rehash(再哈希),减少现有哈希桶,让entry元素扩散在不同哈希桶中,缩小单通元素数量。默认有两个哈希表,则哈希表1,哈希表2。rehash过程如下。
- 给哈希表 2 调配更大的空间,例如是以后哈希表 1 大小的两倍
- 把哈希表 1 中的数据从新映射并拷贝到哈希表 2 中
- 开释哈希表 1 的空间。
哈表1数据太多,一次性拷贝到哈希表2工夫太长,阻塞线程,影响redis失常服务怎么办?
渐进式rehash,在下面第二步过程中,有一个客户端申请,就把哈希表1索引1的元素先迁徙过来再有一个申请,再把哈希表索引2的元素迁徙,这样就防止了全量拷贝阻塞线程影响服务。