【redis】redis常见数据结构及其底层,redis单线程读写效率高于多线程的理解,

news2025/5/16 19:38:26

redis常用数据结构及底层

  • string字符串、list链表、set无序集合、zset有序集合、hash哈希

1.string

  • 底层结构是SDS简单动态字符串
struct sdshdr {
    int len;     // 已用长度(字符串实际长度)
    int free;    // 剩余可用空间
    char buf[];  // 数组,存储实际字符数据
};
  • 相较于c字符串,它通过lenfree字段实现O(1)长度查询,自动扩容,支持二进制存储

2.list

  • 是一个有序可重复链表结构,会根据数据量和长度,自动选择不同数据结构,提升性能
  • 底层实现主要三种:
    • ziplist压缩列表:redis3.2之前,元素数量<512,元素大小<64用压缩列表
    • linkedlist双链表:redis3.2之前大数据量使用。
    • quicklist快速列表:redis3.2之后的默认存储,所有情况都用quicklist,他是由多个ziplist组成的双向链表

3.set

  • 无序,元素唯一的集合类型,会根据数据量和内容,自动选择不同数据结构,提升性能
  • 底层两种实现:
    • intset整数集合:适用于,都是整数数量<=512。内存连续升序排列,插入删除慢
    • hashtable哈希表:适用于,多数据类型,数量多。标准hash,内存开销较大(存储指针、哈希表结构)操作效率高

redis会根据数据自动切换,添加非整数/数量超512自动转hashtable,但是不会重新转回来

4.zset

  • 元素唯一,通过每个元素关联的score自动排序的结构,支持范围查找,范围排名等操作
  • 底层两种实现:
    • skiplist跳表:跳表提供有序遍历和范围操作
    • hashtable哈希表:哈希表提供快速查找

为什么用跳表而不是红黑树?
实现简单插入删除性能好(时间复杂度平均 O(log n)),更容易实现范围操作

  • 跳表原理:通过分多个索引层加速查询底层完整的有序链表,上层是索引层,每上一层减少一半,所以log₂n
第3层:1 --------------------------> 9
第2层:1 ------> 5 ------> 7 ------> 9
第1层:1 -> 3 -> 5 -> 6 -> 7 -> 8 -> 9

5.hash

  • 一个键值对集合,常用于存对象(用户配置)等,会根据字段数量和内容自动选择不同的实现方式
  • 底层两种实现:
    • ziplist压缩列表:对象用压缩列表,(字段数<512,长度<64)连续内存,占用少,节省空间,查询速度稍慢,字段超过阈值时,会自动转换为hashtable
    • hashtable哈希表:对象用hash表,读写效率更高

为什么小数据用 ziplist?
内存利用率高(无指针开销)

Redis 的哈希表如何扩容?
采用 渐进式扩容:扩容时同时保留新旧两个哈希表,分批次迁移数据

关于hash渐进式扩容,可以看我的这篇https://blog.csdn.net/m0_74282926/article/details/147522876

总结

数据类型底层结构说明
Stringint / embstr / raw(SDS)根据长度和内容选择优化方式:int 表示整数,embstr 表示小字符串,raw 是通用 SDS
Listziplist(旧) / quicklistRedis 3.2+ 默认用 quicklist(多个 ziplist + 双向链表)
Setintset / hashtable小量整数用 intset,其他情况用 hashtable
ZSetskiplist + hashtable哈希表查找,跳表排序;两个结构同时维护
Hashziplist / hashtable字段少且短用 ziplist,否则用 hashtable

为什么redis单线程反而更快?

  1. 一个误区:并不是多线程一定比单线程快:
  • 在mysql中我们对于耗时较长的磁盘io操作往往采用多线程并发执行,因为多线程产生的线程切换开销往往于磁盘读写开销,所以并发等待可以提高效率;
  • 而redis是内存存储,本身单线程速度就很快,如果用多线程,
    涉及cpu上下文切换,锁竞争,这些耗时可能会超过内存中取数据的时间,从而降低性能。
  1. redis的性能瓶颈往往是网络或者内存,而非cpu,内存访问的速度高于切换线程的开销

  2. Redis 6.0 起引入了I/O 多线程模型,用于并行处理高并发下,客户端的网络读写数据(网络 I/O),但命令执行仍是单线程,以保证数据一致性

网络线程并发提速,核心逻辑线程保证安全。

  1. redis的数据协议设计很高效,比如HashTable,理想情况下只需要O(1)的时间复杂度就可以找到数据。

例如 Hash 的 ziplist + hashtable 组合,在数据量小时用 ziplist(节省内存),时转 HashTable(O(1) 查询)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQLPub:一个提供AI助手的免费MySQL数据库服务

给大家介绍一个免费的 MySQL 在线数据库环境&#xff1a;SQLPub。它提供了最新版本的 MySQL 服务器测试服务&#xff0c;可以方便开发者和测试人员验证数据库功能&#xff0c;也可以用于学习 MySQL。 免费申请 在浏览器中输入以下网址&#xff1a; https://sqlpub.com/ SQLP…

URP相机如何将场景渲染定帧模糊绘制

1&#xff09;URP相机如何将场景渲染定帧模糊绘制 2&#xff09;为什么Virtual Machine会随着游戏时间变大 3&#xff09;出海项目&#xff0c;打包时需要勾选ARMv7吗 4&#xff09;Unity是手动还是自动调用GC.Collect 这是第431篇UWA技术知识分享的推送&#xff0c;精选了UWA社…

WeakAuras Lua Script ICC (BarneyICC)

WeakAuras Lua Script ICC &#xff08;BarneyICC&#xff09; https://wago.io/BarneyICC/69 全量英文字符串&#xff1a; !WA:2!S33c4TXX5bQv0kobjnnMowYw2YAnDKmPnjnb4ljzl7sqcscl(YaG6HvCbxaSG7AcU76Dxis6uLlHNBIAtBtRCVM00Rnj8Y1M426ZH9XDxstsRDR)UMVCTt0DTzVhTjNASIDAU…

FramePack - 开源 AI 视频生成工具

&#x1f3ac; 项目简介 由开发者 lllyasviel 创建的一个轻量级动画帧处理工具库&#xff0c;专门用于游戏开发、动画制作和视频处理中的帧序列打包与管理。该项目采用高效的算法实现&#xff0c;能够显著提升动画资源的处理效率。 此 AI 视频生成项目&#xff0c;旨在通过低显…

Vuetify框架使用(一)之v-snackbar 组件封装及全局使用

说明&#xff1a;v-snackbar 组件适用于统一管理消息提示框(操作反馈的提示) 看效果&#xff1a; 1、在状态管理中创建文件&#xff0c;统一管理 // stores/snackbar.js /*** 统一管理消息提示框(操作反馈的提示)*/import { defineStore } from pinia; // 消息类型 export co…

FPGA: UltraScale+ bitslip实现(方案+代码)

收获 一晃五年~ 五年前那个夏夜&#xff0c;我对着泛蓝的屏幕敲下《给十年后的自己》&#xff0c;在2020年的疫情迷雾中编织着对未来的想象。此刻回望&#xff0c;第四届集创赛的参赛编号仍清晰如昨&#xff0c;而那个在家熬夜焊电路板的"不眠者"&#xff0c;现在…

【SpeechLMs】语音大型语言模型综述《A Survey on Speech Large Language Models》

摘要 大型语言模型 (LLM) 表现出强大的上下文理解能力和显著的多任务性能。 因此&#xff0c;研究人员一直在寻求将 LLM 整合到更广泛的语音语言理解 (SLU) 领域。 与传统方法不同&#xff0c;传统方法是将 LLM 级联以处理自动语音识别 (ASR) 生成的文本&#xff0c;而新方法则…

吴恩达机器学习笔记:特征与多项式回归

1.特征和多项式回归 如房价预测问题&#xff0c; ℎθ (x) θ0 θ1 frontage θ2 deptℎ x1 frontage&#xff08;临街宽度&#xff09;&#xff0c;x2 deptℎ&#xff08;纵向深度&#xff09;&#xff0c;x frontage ∗ deptℎ area &#xff08;面积&#xff09;…

LangChain4j正式发布-简化将 LLM 集成到 Java 应用程序过程

LangChain4j 的目标是简化将 LLM 集成到 Java 应用程序中的过程。 官网地址 源码地址 开源协议&#xff1a;Apache License 2.0 实现方法 统一 API&#xff1a;LLM 提供程序&#xff08;如 OpenAI 或 Google Vertex AI&#xff09;和嵌入&#xff08;矢量&#xff09;存储…

【C++】汇编角度分析栈攻击

栈攻击 介绍原理示例代码汇编分析 介绍原理 核心原理是通过 缓冲区溢出&#xff08;Buffer Overflow&#xff09; 等漏洞&#xff0c;覆盖栈上的关键数据&#xff08;如返回地址、函数指针&#xff09;&#xff0c;从而改变程序执行流程&#xff1b; 在 C 中&#xff0c;每个…

Vue 3 打开 el-dialog 时使 el-input 获取焦点

运行代码&#xff1a;https://andi.cn/page/622178.html 效果&#xff1a;

C++23 views::repeat (P2474R2) 深入解析

文章目录 引言C20 Ranges库回顾什么是Rangesstd::views的作用 views::repeat概述基本概念原型定义工作原理应用场景初始化容器模拟测试数据 总结 引言 在C的发展历程中&#xff0c;每一个新版本都会带来一系列令人期待的新特性&#xff0c;这些特性不仅提升了语言的性能和表达…

OpenCv高阶(4.0)——案例:海报的透视变换

文章目录 前言一、工具函数模块1.1 图像显示函数1.2 保持宽高比的缩放函数1.3 坐标点排序函数 二、透视变换核心模块2.1 四点透视变换实现 三、主流程技术分解3.1 图像预处理3.2 轮廓检测流程3.3 最大轮廓处理 四、后处理技术4.1 透视变换4.2 形态学处理 五、完整代码总结 前言…

光谱相机的图像预处理技术

光谱相机的图像预处理技术旨在消除噪声、增强有效信息&#xff0c;为后续分析提供高质量数据。 一、预处理流程与技术要点 ‌辐射校正‌ ‌辐射定标‌&#xff1a;将图像灰度值转换为绝对辐射亮度&#xff0c;常用反射率法、辐亮度法和辐照度法消除传感器响应差异&#xff0…

k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持

k8s监控方案实践补充&#xff08;一&#xff09;&#xff1a;部署Metrics Server实现kubectl top和HPA支持 文章目录 k8s监控方案实践补充&#xff08;一&#xff09;&#xff1a;部署Metrics Server实现kubectl top和HPA支持一、Metrics Server简介二、Metrics Server实战部署…

嵌入式调试新宠!J-Scope:免费+实时数据可视化,让MCU调试效率飙升!

&#x1f4cc; 痛点直击&#xff1a;调试还在用“断点打印”&#xff1f; 嵌入式开发中&#xff0c;你是否也经历过这些崩溃瞬间&#xff1f; 想实时观察变量变化&#xff0c;代码里插满printf&#xff0c;结果拖垮系统性能&#xff1f; 断点调试打断程序运行&#xff0c;时序…

微信小程序学习之搜索框

1、第一步&#xff0c;我们在index.json中引入vant中的搜索框控件&#xff1a; {"usingComponents": {"van-search": "vant/weapp/search/index"} } 2、第二步&#xff0c;直接在index.wxml中添加布局&#xff1a; <view class"index…

Altium Designer AD如何输出PIN带网络名的PDF装配图

Altium Designer AD如何输出PIN带网络名的PDF装配图 文描述在Altium Designer版本中设置焊盘网络名时遇到的问题&#xff0c;网络名大小不一致&#xff0c;部分PAD的网络名称未显示&#xff0c;可能涉及字符大小设置和版本差异。 参考 1.AD导出PCB装配图 https://blog.csd…

VMware虚拟机 安装 CentOS 7

原文链接: VMware虚拟机 安装 CentOS 7 安装准备 软件: VMware Workstation Pro 17.6.3 镜像: CentOS-7.0-1406-x86_64-DVD.iso 我打包好放这了&#xff0c;VMware 和 CentOS7 &#xff0c;下载即可。 关于VMware Workstation Pro 17.6.3&#xff0c;傻瓜式安装即可。 CentO…

Python训练打卡Day22

复习日&#xff1a; 1.标准化数据&#xff08;聚类前通常需要标准化&#xff09; scaler StandardScaler() X_scaled scaler.fit_transform(X) StandardScaler() &#xff1a;这部分代码调用了 StandardScaler 类的构造函数。在Python中&#xff0c;当你在类名后面加上括号…