关于redis:redis键值对用什么结构组织

2次阅读

共计 784 个字符,预计需要花费 2 分钟才能阅读完成。

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 的元素迁徙,这样就防止了全量拷贝阻塞线程影响服务。

正文完
 0