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过程如下。

  1. 给哈希表 2 调配更大的空间,例如是以后哈希表 1 大小的两倍
  2. 把哈希表 1 中的数据从新映射并拷贝到哈希表 2 中
  3. 开释哈希表 1 的空间。
哈表1数据太多,一次性拷贝到哈希表2工夫太长,阻塞线程,影响redis失常服务怎么办?

渐进式rehash,在下面第二步过程中,有一个客户端申请,就把哈希表1索引1的元素先迁徙过来再有一个申请,再把哈希表索引2的元素迁徙,这样就防止了全量拷贝阻塞线程影响服务。