【redis】redis常见数据结构及其底层,redis单线程读写效率高于多线程的理解,
redis常用数据结构及底层
- string字符串、list链表、set无序集合、zset有序集合、hash哈希
1.string
- 底层结构是
SDS简单动态字符串
struct sdshdr {int len; // 已用长度(字符串实际长度)int free; // 剩余可用空间char buf[]; // 数组,存储实际字符数据
};
- 相较于c字符串,它通过len和free字段实现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
总结
数据类型 | 底层结构 | 说明 |
---|---|---|
String | int / embstr / raw(SDS) | 根据长度和内容选择优化方式:int 表示整数,embstr 表示小字符串,raw 是通用 SDS |
List | ziplist(旧) / quicklist | Redis 3.2+ 默认用 quicklist(多个 ziplist + 双向链表) |
Set | intset / hashtable | 小量整数用 intset,其他情况用 hashtable |
ZSet | skiplist + hashtable | 哈希表查找,跳表排序;两个结构同时维护 |
Hash | ziplist / hashtable | 字段少且短用 ziplist,否则用 hashtable |
为什么redis单线程反而更快?
- 一个误区:并不是多线程一定比单线程快:
- 在mysql中我们对于耗时较长的磁盘io操作往往采用多线程并发执行,因为多线程产生的线程切换开销往往小于磁盘读写开销,所以并发等待可以提高效率;
- 而redis是内存存储,本身单线程速度就很快,如果用多线程,
涉及cpu上下文切换,锁竞争,这些耗时可能会超过从内存中取数据的时间,从而降低性能。
-
redis的性能瓶颈往往是网络或者内存,而非cpu,内存访问的速度高于切换线程的开销
-
Redis 6.0 起引入了I/O 多线程模型,用于并行处理高并发下,客户端的网络读写数据(网络 I/O),但命令执行仍是单线程,以保证数据一致性
网络用多线程并发提速,核心逻辑用单线程保证安全。
- redis的数据协议设计很高效,比如HashTable,理想情况下只需要O(1)的时间复杂度就可以找到数据。
例如 Hash 的 ziplist + hashtable 组合,在数据量小时用 ziplist(节省内存),大时转 HashTable(O(1) 查询)。
相关文章:
【redis】redis常见数据结构及其底层,redis单线程读写效率高于多线程的理解,
redis常用数据结构及底层 string字符串、list链表、set无序集合、zset有序集合、hash哈希 1.string 底层结构是SDS简单动态字符串 struct sdshdr {int len; // 已用长度(字符串实际长度)int free; // 剩余可用空间char buf[]; // 数组&#…...
2025年5月AI科技领域周报(5.5-5.11):AGI研究进入关键验证期 具身智能开启物理世界交互新范式
2025年5月AI科技领域周报(5.5-5.11):AGI研究进入关键验证期 具身智能开启物理世界交互新范式 一、本周热点回顾1. OpenAI发布GPT-5多模态大模型 突破通用智能关键阈值2. 特斯拉Optimus机器人量产版发布 具身智能进入工业场景3. 百度文心ERNIE…...

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

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

WeakAuras Lua Script ICC (BarneyICC)
WeakAuras Lua Script ICC (BarneyICC) https://wago.io/BarneyICC/69 全量英文字符串: !WA:2!S33c4TXX5bQv0kobjnnMowYw2YAnDKmPnjnb4ljzl7sqcscl(YaG6HvCbxaSG7AcU76Dxis6uLlHNBIAtBtRCVM00Rnj8Y1M426ZH9XDxstsRDR)UMVCTt0DTzVhTjNASIDAU…...
为什么 mac os .bashrc 没有自动加载?
原因说明 在macOS中,默认情况下,终端使用的是Bash或Zsh作为shell。对于较新版本的macOS(从Catalina开始),默认的shell已经切换为Zsh。因此,如果你正在使用Zsh,.bashrc文件不会自动生效…...

FramePack - 开源 AI 视频生成工具
🎬 项目简介 由开发者 lllyasviel 创建的一个轻量级动画帧处理工具库,专门用于游戏开发、动画制作和视频处理中的帧序列打包与管理。该项目采用高效的算法实现,能够显著提升动画资源的处理效率。 此 AI 视频生成项目,旨在通过低显…...
断点续传使用场景,完整前后端实现示例,包括上传,下载,验证
断点续传在多个场景中非常有用,包括但不限于大文件上传、跨国或跨区域文件传输、移动设备文件传输、备份和同步以及软件更新等。接下来,我将为你提供一个基于Java的后端实现示例,结合前端逻辑来完成整个断点续传的功能,包括上传、…...
【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓
文章目录 🔄 迭代器模式(Iterator Pattern)深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码(背包系统遍历)1. 定义迭代器与聚合接口2. 实现具体聚合类(背包物品集合)3. 实现具…...

Vuetify框架使用(一)之v-snackbar 组件封装及全局使用
说明:v-snackbar 组件适用于统一管理消息提示框(操作反馈的提示) 看效果: 1、在状态管理中创建文件,统一管理 // stores/snackbar.js /*** 统一管理消息提示框(操作反馈的提示)*/import { defineStore } from pinia; // 消息类型 export co…...

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

【SpeechLMs】语音大型语言模型综述《A Survey on Speech Large Language Models》
摘要 大型语言模型 (LLM) 表现出强大的上下文理解能力和显著的多任务性能。 因此,研究人员一直在寻求将 LLM 整合到更广泛的语音语言理解 (SLU) 领域。 与传统方法不同,传统方法是将 LLM 级联以处理自动语音识别 (ASR) 生成的文本,而新方法则…...
C# 实现雪花算法(Snowflake Algorithm)详解与应用
在现代分布式系统中,生成全局唯一的标识符(ID)是一个非常重要的问题。随着微服务架构和分布式系统的普及,传统的单机数据库生成 ID 的方式已无法满足高并发和高可用的需求。为了解决这个问题,Twitter 提出了 雪花算法&…...

吴恩达机器学习笔记:特征与多项式回归
1.特征和多项式回归 如房价预测问题, ℎθ (x) θ0 θ1 frontage θ2 deptℎ x1 frontage(临街宽度),x2 deptℎ(纵向深度),x frontage ∗ deptℎ area (面积)…...
Flutter 与HarmonyOS Next 混合渲染开发实践:以 fluttertpc_scan 三方库为例
一、背景与价值 在跨平台开发中,Flutter 以其高效的 UI 构建能力著称,而鸿蒙 Next(OpenHarmony)则提供了深度系统集成的原生能力。将两者结合,可实现 UI 跨平台 原生功能深度融合 的混合渲染模式。本文以扫描库 flut…...

LangChain4j正式发布-简化将 LLM 集成到 Java 应用程序过程
LangChain4j 的目标是简化将 LLM 集成到 Java 应用程序中的过程。 官网地址 源码地址 开源协议:Apache License 2.0 实现方法 统一 API:LLM 提供程序(如 OpenAI 或 Google Vertex AI)和嵌入(矢量)存储…...

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

Vue 3 打开 el-dialog 时使 el-input 获取焦点
运行代码:https://andi.cn/page/622178.html 效果:...

C++23 views::repeat (P2474R2) 深入解析
文章目录 引言C20 Ranges库回顾什么是Rangesstd::views的作用 views::repeat概述基本概念原型定义工作原理应用场景初始化容器模拟测试数据 总结 引言 在C的发展历程中,每一个新版本都会带来一系列令人期待的新特性,这些特性不仅提升了语言的性能和表达…...
HTML5 定位详解:相对定位、绝对定位和固定定位
在HTML5和CSS中,定位(positioning)是控制元素在页面上位置的重要机制。主要有四种定位方式:静态定位(static)、相对定位(relative)、绝对定位(absolute)和固定定位(fixed)。下面我将详细讲解这三种非静态定位方式,并提供相应的源代码示例。 …...

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

光谱相机的图像预处理技术
光谱相机的图像预处理技术旨在消除噪声、增强有效信息,为后续分析提供高质量数据。 一、预处理流程与技术要点 辐射校正 辐射定标:将图像灰度值转换为绝对辐射亮度,常用反射率法、辐亮度法和辐照度法消除传感器响应差异࿰…...
CSS 溢出内容处理、可见性控制与盒类型设置深度解析
CSS溢出内容处理、可见性控制与盒类型设置深度解析 一、溢出内容处理(Overflow) 在网页设计中,内容超出容器边界是常见问题。CSS提供了overflow属性及其变体来控制这种情况。 1.1 溢出基本属性 核心属性: overflow: visible&…...

k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持
k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持 文章目录 k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持一、Metrics Server简介二、Metrics Server实战部署…...
从代码学习深度学习 - 实战 Kaggle 比赛:图像分类 (CIFAR-10 PyTorch版)
文章目录 前言1. 读取并整理数据集1.1 读取标签文件1.2 划分训练集和验证集1.3 整理测试集1.4 执行数据整理2. 图像增广2.1 训练集图像变换2.2 测试集(和验证集)图像变换3. 读取数据集3.1 创建 Dataset 对象3.2 创建 DataLoader 对象4. 定义模型4.1 获取 ResNet-18 模型4.2 损…...
【数据结构】二分查找5.12
Basic 需求:在有序数组A内,查找值target 如果找到返回索引 如果找不到返回-1 算法描述: 前提:给定一个内含n个元素的有序数组A(升序),一个待查找值 设置两个索引:i0;jn-1; 如果…...
深入探索向量数据库:构建智能应用的新基础
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4-turbo模型辅助生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认…...
Swagger go中文版本手册
Swaggo(github.com/swaggo/swag)的注解语法是基于 OpenAPI 2.0 (以前称为 Swagger 2.0) 规范的,并添加了一些自己的约定。 主要官方文档: swaggo/swag GitHub 仓库: 这是最权威的来源。 链接: https://github.com/swaggo/swag重点关注: README.md: 包含了基本的安装、使用…...
Cloudera CDP 7.1.3 主机异常关机导致元数据丢失,node不能与CM通信
问题描述 plaintext ERROR Could not load post-deployment data from /var/run/cloudera-scm-agent/process/ccdeploy_hadoop-conf_etchadoopconf.cloudera.yarn_-8903374259073700469 IOError: [Errno 2] No such file or directory: /var/run/cloudera-scm-agent/proce…...
Redis特性与应用
1、分布式缓存与redis 2、redis数据结构和客户端集成 3、缓存读写模式与数据一致性 本地缓存:Hash Map、Ehcache、Caffeine、Google Guava 分布式缓存:Memcached、redis、Hazelcast、Apache ignite redis:基于键值对内存数据库,支…...