首页 > 数据库 >Redis渐进式rehash

Redis渐进式rehash

时间:2024-09-29 14:49:41浏览次数:7  
标签:rehash rehashidx Redis 渐进式 ht 哈希

为什么要渐进式rehash?

在Redis中,哈希表是实现快速键值对查找的关键数据结构,但随着数据的增加,哈希表可能会因为冲突过多或空间不足而需要扩容;相反,当数据大量删除后,哈希表也可能因为空间利用率过低而需要缩容。在扩容和缩容过程中,由于长度变化会导致key的索引变化,为了避免一次性rehash操作带来的长时间阻塞和性能影响,Redis采用了渐进式rehash策略。

渐进式rehash的基本原理

  • 分步迁移:渐进式rehash不是一次性将所有键值对从旧哈希表迁移到新哈希表,而是将这个迁移过程分散到多个时间片中,每次只迁移一小部分数据。
  • 双哈希表:在rehash过程中,Redis会同时使用两个哈希表(通常称为ht[0]和ht[1]),其中ht[0]是原始哈希表,ht[1]是新分配的哈希表(容量更大或更小)。
  • 逐步迁移:在Redis处理客户端请求的过程中,每次操作前都会检查是否需要执行rehash。如果需要,就会从ht[0]中迁移一部分数据到ht[1]。

渐进式rehash的实现过程

  1. 触发条件
    • 当哈希表的负载因子(已存储键值对数量 / 哈希表大小)超过预设的扩容阈值时(如5),Redis会触发扩容rehash。
    • Redis的定时任务(如serverCron)会定期检查哈希表的使用情况,当负载因子低于缩容阈值(如10%)时,会触发缩容rehash。
  1. 迁移过程
    • Redis会设置一个全局变量rehashidx来记录当前rehash的进度。
    • 在处理每个客户端请求时,如果rehashidx小于ht[0]的大小,Redis就会从ht[0]的rehashidx索引位置所对应的链表中的所有键值对迁移到ht[1]相应的哈希桶中,并将rehashidx加1。
    • 这个过程会持续进行,直到ht[0]中的所有键值对都被迁移到ht[1]。
  1. 完成rehash
    • 当rehashidx达到ht[0]的大小时,说明rehash过程已完成。
    • Redis会将ht[1]替代ht[0]成为新的主哈希表,并释放掉旧的ht[0],同时重置rehashidx为-1,等待下次需要rehash时再次启用。

渐进式rehash的优点

  • 减少阻塞:通过将rehash过程分散到多个时间片中,避免了单次操作带来的长时间阻塞。
  • 提高性能:在rehash过程中,Redis仍然可以正常处理客户端请求,保证了服务的连续性和性能。
  • 空间利用:通过及时的扩容和缩容,保证了哈希表的空间利用率和查询效率。

标签:rehash,rehashidx,Redis,渐进式,ht,哈希
From: https://blog.csdn.net/qq_41354522/article/details/142635737

相关文章

  • Redis小白学习笔记1
    目录这3篇文章是我在学习Redis的过程中,总结的笔记:第一篇Redis学习笔记1-理论篇1,Redis中的数据类型2,Redis的IO模型3,Redis的持久化4,Redis集群原理5,将Redis用作缓存第二篇Redis学习笔记2-性能篇6,Redis高性能的影响因素6.1,Redis内部的阻塞式操作......
  • Python对数据库(MySQL,redis、MongoDB)的操作
    Python对数据库的操作(MySQL,redis、MongoDB)一、操作MySQL数据库安装pymysql:需要通过pipinstallpymysql进行安装。查询数据:fetchone、fetchmany(n)、fetchall()importpymysql#建立mysql连接,ip、端口、用户名、密码(passwd,不能写成其他,例如:pwd或者p,否则报错)、库名con......
  • 算法实战:剖析 Redis 常用的数据类型对应的数据结构
    算法实战:剖析Redis常用的数据类型对应的数据结构Redis是一个非常流行的内存数据库,它提供了多种数据类型,每种数据类型都有其特定的数据结构支持。了解这些数据结构对于深入理解Redis的工作原理和优化使用非常重要。本文将剖析Redis常用的数据类型对应的数据结构,并通......
  • Redisson详解
    Redisson是Redis的一个分布式锁实现库,它提供了简单易用的API来处理分布式锁。在处理未获取到锁的线程时,Redisson通过合理的机制来管理等待和超时行为,确保锁的竞争有序并防止资源的长期占用。具体来说,Redisson处理未获取到锁的线程的方式如下:1.等待锁(可配置超时时间)当......
  • Redis 五大基本数据类型及其应用场景进阶(缓存预热、雪崩 、穿透 、击穿)
    Redis数据类型及其应用场景Redis是什么?Redis是一个使用C语言编写的高性能的基于内存的非关系型数据库,基于Key/Value结构存储数据,通常用来缓解高并发场景下对某一资源的频繁请求,减轻数据库的压力。它支持多种数据类型,如字符串、哈希、列表、集合、有序集合等。Redis......
  • Redis学习笔记
    一、Redis简介1.1NOSQLNoSQL(NoSQL=NotOnlySQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型,web2.0纯动态网站已经显得力不从心,暴露了很多难以克服......
  • Redis 集合类型详解及应用
    ......
  • redis 管道 批量处理 transmit multiple commands to the Redis server in one tran
    Redispipelining|Docshttps://redis.io/docs/latest/develop/use/pipelining/RedispipeliningHowtooptimizeround-triptimesbybatchingRediscommandsRedispipeliningisatechniqueforimprovingperformancebyissuingmultiplecommandsatoncewithou......
  • 9--苍穹外卖-SpringBoot项目中Redis的介绍及其使用实例 详解
    目录Redis入门Redis简介Redis服务启动与停止服务启动命令Redis数据类型5种常用数据类型介绍各种数据类型的特点Redis常用命令字符串操作命令哈希操作命令列表操作命令集合操作命令有序集合操作命令通用命令在java中操作RedisRedis的Java客户端SpringDataRe......
  • Redis入门-五大基本数据类型
    启动我的redis(我的redis是在www下面的server下面的redis下面的src里面去执行下面这串指令,如果你的src在其他地方可以换)./redis-server&cd到src下面对redis进行压力测试宝塔用不了(因为没有这个对应的文件)redis-benchmark-hlocalhost-p6379-c100-n100000常用命令......