首页 > 数据库 >Redis rehash

Redis rehash

时间:2023-06-12 18:00:13浏览次数:40  
标签:rehash 负载 Redis 因子 键值 哈希

 

Redis rehash 是什么?

Redis rehash 是一种渐进式的哈希表扩展或收缩的机制,用于保持哈希表的负载因子在一个合理的范围内,提高哈希表的性能和空间利用率12。

哈希表是 Redis 的基础数据结构,用于存储键值对。哈希表由一个数组和一个链表组成,数组的每个元素是一个指向链表的指针,链表中存放着具有相同索引值的键值对。索引值是通过对键计算哈希值并与数组大小取模得到的34。

当哈希表中存储的键值对数量增加或减少时,哈希表的负载因子(load factor)也会变化。负载因子是哈希表已保存节点数量和哈希表大小的比值15。如果负载因子过高,说明哈希表中的冲突较多,会影响查找、插入和删除操作的效率;如果负载因子过低,说明哈希表中的空间浪费较多,会占用过多的内存资源。

为了解决这个问题,Redis 设计了 rehash 机制,当以下条件中的任意一个被满足时,程序会自动开始对哈希表执行扩展操作:

  • 服务器目前没有在执行 BGSAVE 命令或者 BGREWRITEAOF 命令, 并且哈希表的负载因子大于等于 1 ;
  • 服务器目前正在执行 BGSAVE 命令或者 BGREWRITEAOF 命令, 并且哈希表的负载因子大于等于 5 ;

另一方面,当哈希表的负载因子小于 0.1 时,程序自动开始对哈希表执行收缩操作15。

Redis rehash 的过程是怎样的?

Redis rehash 的过程是渐进式的,也就是说,并不是一次性地将所有键值对从旧的哈希表迁移到新的哈希表,而是分多次进行,在每次执行某个哈希表操作时,顺便将一部分键值对进行 rehash ,直到完成整个 rehash 过程。

具体来说,Redis 的字典(dict)结构中有两个哈希表(ht[0] 和 ht1),还有一个 rehashidx 用来控制 rehash 进度。平时只使用 ht[0] 存储数据,当需要进行 rehash 时,会为 ht1 分配空间,并根据扩展或收缩操作确定新的数组大小。然后将 rehashidx 设置为 0 ,表示开始 rehash 。每次执行某个哈希表操作时(如添加、删除、查找等),都会顺便将 ht[0] 中索引为 rehashidx 的链表上的所有键值对迁移到 ht1 中,并将 rehashidx 加一。这样,在多次执行哈希表操作后,最终会将 ht[0] 中的所有键值对都迁移到 ht1 中。此时,释放 ht[0] ,将 ht1 设置为 ht[0] ,并为 ht1 分配一个空白哈希表,为下一次 rehash 做准备。同时,将 rehashidx 设置为 -1 ,表示 rehash 结束12。

Redis rehash 的优点和缺点是什么?

Redis rehash 的优点是:

  • 可以避免一次性的大规模内存分配和数据迁移,减少内存碎片和性能抖动;
  • 可以根据负载因子的变化动态地调整哈希表的大小,保持哈希表的高效和节省;
  • 可以在 rehash 过程中同时处理对哈希表的读写操作,不影响正常的服务功能;

Redis rehash 的缺点是:

  • 需要额外的空间和时间来维护两个哈希表和 rehashidx ,增加了复杂度和开销;
  • 在 rehash 过程中,对哈希表的操作需要同时考虑两个哈希表,增加了逻辑判断和计算量;
  • 在 rehash 过程中,如果发生故障或重启,可能会导致数据丢失或不一致;

标签:rehash,负载,Redis,因子,键值,哈希
From: https://www.cnblogs.com/shoshana-kong/p/17475744.html

相关文章

  • 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......
  • Redis集群-哨兵模式搭建(1主2从3哨兵节点)
    Redis集群-哨兵模式搭建(1主2从3哨兵节点)原创 北极星 运维记事 2023-04-2022:47 发表于四川收录于合集#redis8个主机规划类型IP地址端口号主192.168.77.1456379从1192.168.77.1466379从2192.168.77.1476379哨兵1192.168.77.14526379哨兵2......
  • 通过redis学网络(2)-redis网络模型
    本系列主要是为了对redis的网络模型和集群原理进行学习,我会用golang实现一个reactor网络模型,并实现对redis协议的解析。系列源码已经上传githubhttps://github.com/HobbyBear/tinyredis/tree/chapter2redis网络模型在介绍redis网络模型前,我们先来看看redis的一条命令执行......