Redis的内存预分配策略

        Redis的内存预分配策略是一种优化手段,旨在减少频繁的内存分配和释放操作对性能的影响。以下是对Redis在使用各数据结构类型时内存变化以及触发底层数据结构变化条件的详细分析:

 

一、内存预分配策略概述

        Redis通过预先分配足够的内存,可以提高操作效率,尤其是在高并发场景下。Redis在某些数据结构(如字符串、列表、哈希等)存储数据时,不是每次都按照精确的内存需求分配,而是会额外预留一部分内存空间。这样做可以减少频繁的内存分配系统调用,提高数据结构扩展时的性能,并降低内存碎片化的风险。

二、各数据结构类型的内存变化

  1. 字符串(String)

    • Redis的字符串类型基于简单动态字符串(SDS)实现,支持动态扩容。
    • 当字符串长度超过当前分配的内存容量时,SDS会进行扩容。扩容后的新内存大小通常为当前长度的两倍,但也会根据具体情况进行调整。
    • 当字符串缩短时,预分配的空间不会立刻释放,但可以复用。
  2. 哈希(Hash)

    • Redis的哈希类型可以使用ziplist或hashtable存储。
    • 当ziplist的键值对数量或单个键值长度超过限制时,或者当hashtable的负载因子(填充率)超过阈值时,会自动触发底层存储结构的切换。
    • hashtable在扩容时,通常会按照两倍的大小进行扩展,并使用渐进式rehash分批次迁移数据,以降低性能抖动。
  3. 列表(List)

    • Redis的列表类型在底层使用quicklist(快速列表)存储,每个节点是一个ziplist。
    • 当新增元素导致ziplist的容量不足时,会触发扩容。如果ziplist达到配置的最大容量限制,则quicklist会拆分出一个新的节点。
    • 扩容是成比例的,通常为当前容量的两倍,以减少未来的扩容频率。
  4. 集合(Set)

    • Redis的集合类型可以使用intset(整数集合)或hashtable存储。
    • 当插入的元素类型超出intset的当前范围(如从int16扩展为int32)或集合中的元素数量或类型复杂度超出intset的范围时,会触发从intset到hashtable的转换。
    • hashtable在扩容时,也会按照两倍的大小进行扩展。
  5. 有序集合(Sorted Set)

    • Redis的有序集合可以使用ziplist或zskiplist(跳跃表)存储。
    • 当有序集合使用ziplist存储且现有内存空间不足以容纳新元素时,或者集合中的元素数量超过一定阈值(如128个)时,会触发从ziplist到zskiplist的转换。
    • zskiplist在扩容时,会通过动态调整索引层数来维持性能。

三、触发底层数据结构变化的条件

  1. 字符串(String)

    • 扩容条件:字符串长度超过当前分配的内存容量。
    • 缩容(复用)条件:字符串缩短时,预分配的空间不会立刻释放,但可以复用。
  2. 哈希(Hash)

    • 从ziplist切换到hashtable的条件:
      • ziplist的键值对数量超过限制(如512个)。
      • ziplist的单个键值长度超过限制(如64字节)。
      • hashtable的负载因子超过阈值(如1.0)。
    • hashtable扩容条件:负载因子超过阈值。
    • hashtable缩容条件:负载因子降到过低(如小于0.1)时,会触发缩容。
  3. 列表(List)

    • 扩容条件:新增元素导致ziplist的容量不足。
    • 拆分节点条件:ziplist达到配置的最大容量限制。
  4. 集合(Set)

    • 从intset切换到hashtable的条件:
      • 插入的元素类型需要更大的存储空间(如从int16升级到int32)。
      • 集合中的元素数量或类型复杂度超出intset的范围。
    • hashtable扩容条件:负载因子超过阈值。
  5. 有序集合(Sorted Set)

    • 从ziplist切换到zskiplist的条件:
      • 有序集合中的元素数量超过一定阈值(如128个)。
      • 有序集合中的任意元素长度超过一定阈值(如64字节)。
      • 新增元素导致内存空间不足。
    • zskiplist扩容条件:通过动态调整索引层数来维持性能。

        综上所述,Redis的内存预分配策略结合动态扩容机制,有效提高了性能并降低了内存分配开销。同时,Redis会根据不同的数据结构类型和存储需求,灵活地调整底层存储结构以适应数据的变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948330.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

卸载wps后word图标没有变成白纸恢复

这几天下载了个wps教育版,后头用完了删了 用习惯的2019图标 给兄弟我干没了??? 其他老哥说什么卸载关联重新下 ,而且还要什么撤销保存原来的备份什么,兄弟也是不得不怂了 后头就发现了这个半宝藏博主&…

麒麟服务器安装kafka--亲测

我这安装的是单机版本的: 下载地址:Index of /kafka/3.9.0 我下载的是:https://dlcdn.apache.org/zookeeper/zookeeper-3.9.3/apache-zookeeper-3.9.3-bin.tar.gz https://dlcdn.apache.org/kafka/3.9.0/kafka_2.12-3.9.0.tgz 一、下载并上…

104周六复盘 (188)UI

1、早上继续看二手书的一个章节,程序开发流程、引擎、AI等内容, 内容很浅,基本上没啥用,算是复习。 最大感触就是N年前看同类书的里程碑、AI相关章节时,会感觉跟自己没啥关系, 而如今则密切相关&#xf…

Chromebook 的 4 个最佳变声器

您对使用chromebook 变声器感到困惑吗?您是否认为在 Chromebook 上安装变声器很困难?如果是,那么这篇文章适合您,因为在 Chromebook 上安装和使用简单且准确的变声器非常简单且轻松。 在本文中,我们将分享适用于 Chro…

DC系列之DC-8渗透测试

DC-8 靶机渗透测试实战 靶机下载地址: https://download.vulnhub.com/dc/DC-8.zip(下载速度慢可以用迅雷下载) 一、实验环境 实验环境: kali2024:192.168.234.145(nat模式) 靶机环境DC-7&#…

12306分流抢票软件 bypass v1.16.43 绿色版(春节自动抢票工具)

软件介绍 12306Bypass分流抢票软件,易操作强大的12306抢票软件,全程自动抢票,云识别验证码打码,多线程秒单、稳定捡漏,支持抢候补票、抢到票自动付款,支持多天、多车次、多席别、多乘客、短信提醒等功能。…

NS4861 单灯指示独立耳锂电池充放电管理 IC

1 特性  最大 500mA 线性充电电流,外部可调节  内部预设 4.2V 充电浮充电压  支持 0V 电池充电激活  支持充满 / 再充功能  内置同步升压放电模块,输出电压 5.1V  同步升压 VOUT 最大输出电流 500mA  VOL/OR 独…

基于Java的敬老院管理系统的设计和实现【源码+文档+部署讲解】

基于Java的敬老院管理系统设计和实现 摘 要 新世纪以来,互联网与计算机技术的快速发展,我国也迈进网络化、集成化的信息大数据时代。对于大众而言,单机应用早已成为过去,传统模式早已满足不了当下办公生活等多种领域的需求,在一台电脑上不联网的软件少之又少&#x…

基于YOLOv8的道路缺陷检测系统

基于YOLOv8的道路缺陷检测系统 (价格80) 包含 [Block crack, Longitudinal crack, Strip repair, Transverse crack] [‘块状裂缝’,‘纵向裂缝’,‘修复’,‘横向裂缝’] 4个类 通过PYQT构建UI界面,包含图片检测&#xff…

我用AI学Android Jetpack Compose之开篇

最近突发奇想,想学一下Jetpack Compose,打算用Ai学,学最新的技术应该要到官网学,不过Compose已经出来一段时间了,Ai肯定学过了,用Ai来学,应该问题不大,学习过程记录下来,…

unity学习7:unity的3D项目的基本操作: 坐标系

目录 学习参考 1 unity的坐标系 1.1 左手坐标系 1.2 左手坐标系和右手坐标系的区别 1.3 坐标系的原点(0,0,0) 2 坐标系下的具体xyz坐标 2.1 position这里的具体xyz坐标值 2.2 父坐标 2.3 世界坐标和相对坐标 2.3.1 世界坐标 2.3.2 相对坐标 2.4 父物体,…

爬虫案例-爬取某度文档

文章目录 1、第三方库的安装和pytesseract安装2、爬取某度文档的代码3、效果图 1、第三方库的安装和pytesseract安装 #以下是安装http请求的第三方库 pip install requests #以下是安装处理文档的第三方库 pip install python-docx #以下是安装处理图片的第三方库 pip install…

在Lua中,Metatable元表如何操作?

Lua中的Metatable(元表)是一个强大的特性,它允许我们改变表(table)的行为。下面是对Lua中的Metatable元表的详细介绍,包括语法规则和示例。 1.Metatable介绍 Metatable是一个普通的Lua表,它用于…

【Ubuntu20.04】Apollo10.0 Docker容器部署+常见错误解决

官方参考文档【点击我】 Apollo 10.0 版本开始,支持本机和Docker容器两种部署方式。 如果您使用本机部署方式,建议使用x86_64架构的Ubuntu 22.04操作系统或者aarch64架构的Ubuntu 20.04操作系统。 如果您使用Docker容器部署方式,可以使用x…

springboot整合Logback

Logback介绍 描述 Logback是由log4j创始人设计的另外一种开源日志组件,性能比log4j要好。相对是一个可靠、通用、快速而又灵活的Java日志框架。 Logback主要分三个模块 1、logback-core:其他两个模块的基础模块 2、logback-classic:它是lo…

仓库叉车高科技安全辅助设备——AI防碰撞系统N2024G-2

在当今这个高效运作、安全第一的物流时代,仓库作为供应链的中心地带,其安全与效率直接关系到企业的命脉。 随着科技的飞速发展,传统叉车作业模式正逐步向智能化、安全化转型,而在这场技术革新中,AI防碰撞系统N2024G-2…

学习笔记|arduino uno r3| RGB 灯珠|Atmega328P|PWM|analogWrite|analogRead函数: RGB灯珠呼吸灯

目录 RGB 灯珠呼吸灯实验RGB 灯珠实验概述工作原理组件清单接线程序代码编译和执行 Tips: Arduino常用的函数解释analogWrite(pin, value)函数analogRead(pin)函数 总结 RGB 灯珠呼吸灯实验 RGB 灯珠实验概述 1-三色LED黑板模块的PCB颜色为黑色,使用5M…

杰发科技——使用ATCLinkTool解除读保护

0. 原因 在jlink供电电压不稳定的情况下,概率性出现读保护问题,量产时候可以通过离线烧录工具避免。代码中开了读保护,但是没有通过can/uart/lin/gpio控制等方式进行关闭,导致无法关闭读保护。杰发所有芯片都可以用本方式解除读保…

ICLR2017 | I-FGSM | 物理世界中的对抗样本

Adversarial Examples in The Physical World 摘要-Abstract引言-Introduction生成对抗图像的方法-Methods of Generating Adversarial Images对抗样本的图片-Photos of Adversarial Examples对抗图像的破坏率-Destruction Rate of Adversarial Images实验设置-Experimental Se…

MySQL(四)MySQL Select语句

1. MySQL Select语句 1.1. 基本查询语句 mysql>select 列名 from 表名;(基本结构查询某一列) mysql>select 列名1,列名2 from 表名;(查询所有列多列) mysql>select * from 表名;(*代表查询所有列) 查询时可以给列设定别名通过as 关键字,别名可以是汉字&a…