Redis——扩容

解决哈希冲突

当要将一个新的键值对添加到字典里面时,程序需要先根据键值对的键计算出哈希值和索引值,然后再根据索引值,将包含新键值对的哈希表节点放到哈希表数组的指定索引上。

当有两个或以上数量的键被分配到了哈希表数组的同一个索引上时,称为哈希冲突,Redis的哈希表使用单向链表解决冲突,使用哈希表节点的next指针将冲突的节点连接起来,因为dictEntry节点组成的链表没有指向链表表尾的指针,为了速度考虑,总是将新节点添加的链表的表头位置(复杂度为O(1))。


rehash

为了让哈希表的负载因子(load factor)维持在一个合理的范围内,会使用rehash(重新散列)操作对哈希表进行相应的扩展或收缩。

哈希表被扩展的条件:
1)Redis服务器目前没有在执行BGSAVE命令或BGREWRITEAOF命令,并且哈希表的负载因子大于等于1。

2)Redis服务器目前在执行BGSAVE命令或BGREWRITEAOF命令,并且哈希表的负载因子大于等于5。

负载因子=哈希表已保存节点数量 / 哈希表大小 load_factor = ht[0].used / ht[0].size

当哈希表的负载因子小于0.1时,对哈希表执行收缩操作。


rehash的操作步骤

1)为字典的ht[1]哈希表分配空间。

如果执行的是扩展操作,那么ht[1] 的大小为第一个大于等于ht[0] .used*2的2的n次幂

如果执行的是收缩操作,那么ht[1] 的大小为第一个大于等于ht[0].used 的2的n次幂

因此这里我们为ht[1] 分配 空间为8

2)将ht[0]中的数据转移到ht[1]中,在转移的过程中,重新计算键的哈希值和索引值,然后将键值对放置到ht[1]的指定位置。

数据转移后的结果:

3)当ht[0]的所有键值对都迁移到了ht[1]之后(ht[0]变为空表),将ht[0]释放,然后将ht[1]设置成ht[0],最后为ht[1]分配一个空白哈希表:


渐近式rehash

上面我们说到,在进行拓展或者压缩的时候,可以直接将所有的键值对rehash 到ht[1]中,这是因为数据量比较小。在实际开发过程中,这个rehash 操作并不是一次性、集中式完成的,而是分多次、渐进式地完成的。

渐进式rehash 的详细步骤:

1、为ht[1] 分配空间,让字典同时持有ht[0]和ht[1]两个哈希表

2、在几点钟维持一个索引计数器变量rehashidx,并将它的值设置为0,表示rehash 开始

3、在rehash 进行期间,每次对字典执行CRUD操作时,程序除了执行指定的操作以外,还会将ht[0]中的数据rehash 到ht[1]表中,并且将rehashidx加一

4、当ht[0]中所有数据转移到ht[1]中时,将rehashidx 设置成-1,表示rehash 结束

采用渐进式rehash 的好处在于它采取分而治之的方式,避免了集中式rehash 带来的庞大计算量。

### 麒麟操作系统 C 盘扩容方法 在麒麟操作系统中,C盘通常对应的是根分区 `/` 或者其他逻辑卷管理(LVM)中的特定卷组。以下是关于如何对 C 盘进行扩容的具体操作说明: #### 1. 检查当前磁盘布局 首先需要确认系统的磁盘分布以及 LVM 的状态。可以使用 `lsblk` 和 `df -h` 命令查看现有磁盘和文件系统的情况。 ```bash lsblk df -h ``` 通过上述命令能够获取到设备名称、挂载点及其容量信息[^1]。 #### 2. 扩展物理卷 (Physical Volume, PV) 如果存在未分配的空间或者新添加的硬盘,则需将其初始化为物理卷。假设新增加了一块硬盘 `/dev/sdb` 并且已经创建好分区 `/dev/sdb1`,执行如下命令完成初始化工作: ```bash pvcreate /dev/sdb1 ``` 接着将此新的物理卷加入现有的卷组当中。假如原卷组名为 `vg_klas` ,那么运行下面这条语句即可实现合并存储资源的目的: ```bash vgextend vg_klas /dev/sdb1 ``` 此时再次利用 `vgs` 查看更新后的卷组详情以验证是否成功扩展了可用空间。 #### 3. 调整逻辑卷(Logical Volume,LV)大小 当卷组拥有足够的自由空间之后,就可以着手调整目标逻辑卷尺寸了。设待处理的目标逻辑卷路径为 `/dev/mapper/vg_klas-root` (即所谓的"C盘") , 使用以下指令增加其规模至最大可能值(当然也可以指定具体数值): ```bash lvextend -l +100%FREE /dev/mapper/vg_klas-root ``` 这里 `-l +100%FREE` 参数表示让该逻辑卷占用剩余全部可用区域;而替换参数如 `-L +5G`, 则代表仅增长固定量级(+5GB)[^2]. #### 4. 文件系统在线伸展 最后一步也是至关重要的环节——使实际使用的文件系统感知并应用刚刚扩增出来的额外空间。鉴于大多数现代 Linux 发行版默认采用 XFS 类型作为主要文件系统格式,所以推荐运用工具 `xfs_growfs` 来达成目的 : ```bash xfs_growfs / ``` 至此整个流程结束,重新检验一下成果吧! --- ### 注意事项 - 整个过程中务必小心谨慎对待每一条命令输入准确性,以免误删重要资料造成不可挽回损失。 - 如果不确定某些细节设置,请先做好充分备份再行动。 - 对于特殊场景比如 Redis 数据库集群架构下涉及多节点间同步关系维护等问题则另当别论[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Romeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值