共计 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 过程如下。
- 给哈希表 2 调配更大的空间,例如是以后哈希表 1 大小的两倍
- 把哈希表 1 中的数据从新映射并拷贝到哈希表 2 中
- 开释哈希表 1 的空间。
哈表 1 数据太多,一次性拷贝到哈希表 2 工夫太长,阻塞线程,影响 redis 失常服务怎么办?
渐进式 rehash,在下面第二步过程中,有一个客户端申请,就把哈希表 1 索引 1 的元素先迁徙过来再有一个申请,再把哈希表索引 2 的元素迁徙,这样就防止了全量拷贝阻塞线程影响服务。
正文完