首页 > 数据库 >Redis的rehash的策略

Redis的rehash的策略

时间:2023-06-12 18:25:24浏览次数:52  
标签:rehash rehashindex hash 策略 redis Redis ht 字典

背景: redis字典(hash表)当数据越来越多的时候,就会发生扩容,也就是rehash

对比:java中的hashmap,当数据数量达到阈值的时候(0.75),就会发生rehash,hash表长度变为原来的二倍,将原hash表数据全部重新计算hash地址,重新分配位置,达到rehash目的

redis中的hash表采用的是渐进式hash的方式:

1、redis字典(hash表)底层有两个数组,还有一个rehashidx用来控制rehash

2、初始默认hash长度为4,当元素个数与hash表长度一致时,就发生扩容,hash长度变为原来的二倍

3、redis中的hash则是执行的单步rehash的过程:

每次的增删改查,rehashidx+1,然后执行对应原hash表rehashidx索引位置的rehash

总结:

在扩容和收缩的时候,如果哈希字典中有很多元素,一次性将这些键全部rehash到ht[1]的话,可能会导致服务器在一段时间内停止服务。所以,采用渐进式rehash的方式,详细步骤如下:

  1. ht[1]分配空间,让字典同时持有ht[0]ht[1]两个哈希表
  2. rehashindex的值设置为0,表示rehash工作正式开始
  3. 在rehash期间,每次对字典执行增删改查操作是,程序除了执行指定的操作以外,还会顺带将ht[0]哈希表在rehashindex索引上的所有键值对rehash到ht[1],当rehash工作完成以后,rehashindex的值+1
  4. 随着字典操作的不断执行,最终会在某一时间段上ht[0]的所有键值对都会被rehash到ht[1],这时将rehashindex的值设置为-1,表示rehash操作结束

渐进式rehash采用的是一种分而治之的方式,将rehash的操作分摊在每一个的访问中,避免集中式rehash而带来的庞大计算量。

需要注意的是在渐进式rehash的过程,如果有增删改查操作时,如果index大于rehashindex,访问ht[0],否则访问ht[1]。

标签:rehash,rehashindex,hash,策略,redis,Redis,ht,字典
From: https://www.cnblogs.com/shoshana-kong/p/17475780.html

相关文章

  • redis之hash解析
    Redis底层数据结构之hashhash是日常开发过程中使用Redis的一个数据结构,其底层实现方式有两种,如下所示。一种是zipList,这种是当hash结构的V值较小的时候使用的编码方式。这个已经在上一篇文章中介绍过了。这篇文章主要讲解一下另外一种实现方式,字典dict,当hash结构的V值较大时采用......
  • Redis rehash
     Redisrehash是什么?Redisrehash是一种渐进式的哈希表扩展或收缩的机制,用于保持哈希表的负载因子在一个合理的范围内,提高哈希表的性能和空间利用率12。哈希表是Redis的基础数据结构,用于存储键值对。哈希表由一个数组和一个链表组成,数组的每个元素是一个指向链表的指针,链......
  • Redis高可用的三种实现方式
    Redis高可用的三种实现方式一、高可用的概念​高可用(HighAvailability,即HA),指的是通过尽量缩短日常维护操作和突发的系统崩溃所导致的停机时间,以提高系统和应用的可用性。一个业务系统如果全年无一时刻不在提供服务,它的可用性可达100%。那么什么样的系统可以称之为高可用呢,业......
  • redis的消息发布订阅实现
    文章目录前言一、创建好springboot项目,引入核心依赖二、使用步骤1.自定义一个消息接受类2.声名一个消息配置类3.编写一个测试类总结前言一般项目中都会使用redis作为缓存使用,加速用户体验,实现分布式锁等等,redis可以说为项目中的优化,关键技术实现立下了汗马功劳.今天带来它......
  • redis三:key常用命令
    1.keys*显示所有keyexistsk1k2...有几个就显示几2.typekey显示key的类型 3.delkey删除指定的key4unlinkkey非阻塞删除,del原子的有可能阻塞5.expirekey秒为key设置过期时间ttlkey查看还有多少秒过去,-1永不过期,-2表示已过期 6. redis带着16个库,默认在......
  • Redis实现分页和多条件模糊查询方案
    简介: 本文将基于Redis提供条件查询+分页的技术解决方案。 导言Redis是一个高效的内存数据库,它支持包括String、List、Set、SortedSet和Hash等数据类型的存储,在Redis中通常根据数据的key查询其value值,Redis没有模糊条件查询,在面对一些需要分页、排序以及条件查询的场景时(如......
  • Java开发 - 让你少走弯路的Redis集群搭建
    前言前文中,我们已经对Redis的单节点哨兵的搭建方式做了演示和测试,相信大家已经了解了怎么操作,虽然是单节点,但基本已经满足了部分公司的日常需要,毕竟Redis集群不是什么项目都适用,用上了Redis,也未必需要使用哨兵,甚至集群。但今天,我们还是要把Redis哨兵集群的搭建方式给大家做个分享,万......
  • redis工具类
    packagecom.yashi.common.utils;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.HashOperations;importorg.springframework.data.redis.core.ListOperations;importorg.springframework.data.redis.cor......
  • 如何使用redis实现高效的分页功能
    如何使用redis实现高效的分页功能一、分页的需求和挑战在很多场景下,我们需要对大量的数据进行分页展示,比如社交网络中的动态、电商平台中的商品列表、博客网站中的文章评论等。分页的目的是为了提高用户体验,让用户可以按照自己的喜好和需求来浏览数据,而不是一次性加载所有的数据......
  • redis集群异常修复
    概述分析redis在异常情况在的处理流程,redis集群在正常情况下自动主从切换,前提条件master在线多于一半的情况https://github.com/tair-opensource/RedisShake/wikihttp://www.redis.cn/commands/cluster-failover.html 环境:centos7.xredis-5.xredis-cluster(3master/3slave......