Redis 数据结构详解:底层实现与高效使用场景
String(字符串)
底层实现细节:
- 动态字符串(SDS): SDS相比于C语言的原生字符串,提供了自动内存管理和预分配机制。当字符串长度增加时,SDS会预先分配额外的空间,以减少内存重新分配的次数。
- EMBSTR编码: 在Redis 3.2之后,对于小字符串(长度小于44字节),引入了EMBSTR编码。这种编码将字符串和长度信息一起存储在一个连续的内存块中,以减少内存碎片和分配次数。
使用场景细节:
- 存储简单的文本数据。
- 存储JSON格式的数据。
- 存储序列化后的对象。
List(列表)
底层实现细节:
- ziplist(压缩列表): 当列表元素较少且元素本身较小时,Redis使用ziplist。ziplist是一种紧凑的、连续的内存布局,可以存储多个元素。每个元素由前一个元素的大小、元素内容和元素类型组成。
- linkedlist(双向链表): 当列表元素较多或元素本身较大时,Redis使用linkedlist。双向链表提供了快速的插入和删除操作。
使用场景细节:
- 作为消息队列,按插入顺序处理消息。
- 存储文章或新闻列表,按发布时间排序。
- 存储用户关注列表或好友列表。
Hash(哈希)
底层实现细节:
- 哈希表(hashtable): Redis的哈希表使用开放寻址法解决哈希冲突。每个桶包含一个链表,用于存储具有相同哈希值的键值对。当哈希表需要扩展时(负载因子超过一定阈值),Redis会创建一个更大的哈希表,并将原哈希表中的数据重新哈希到新的哈希表中。
使用场景细节:
- 存储对象的属性,如用户信息、商品详情等。
- 实现缓存系统,将键映射到值。
Set(集合)
底层实现细节:
- intset(整数集合): 当集合只包含整数且元素个数较少时,Redis使用intset。intset是一种紧凑的存储方式,直接存储整数值,而不需要额外的键。
- hashtable(哈希表): 当集合包含非整数元素或元素个数较多时,Redis使用hashtable。
使用场景细节:
- 实现去重功能。
- 执行集合运算,如交集、并集和差集。
- 存储标签或兴趣列表。
Zset(有序集合)
底层实现细节:
- skiplist(跳跃表): 跳跃表是一种可以进行二分查找的有序链表。它通过在链表中添加多级索引来提高查找效率。在Zset中,跳跃表用于按分数对元素进行排序。
- hashtable(哈希表): 哈希表用于存储元素到分数的映射关系,以便在O(1)时间复杂度内获取元素的分数。
使用场景细节:
- 实现排行榜,按分数从高到低排序。
- 存储按权重排序的列表,如搜索引擎中的关键词权重。
- 实现范围查询,如查找分数在某个范围内的元素。
通过这些详细的底层实现和使用场景,我们可以看到Redis是如何在满足性能需求的同时,尽可能地节省内存空间的。不同的数据结构和底层实现在不同的使用场景下都有其优势和适用性。
相关文章:
Redis 数据结构详解:底层实现与高效使用场景
String(字符串) 底层实现细节: 动态字符串(SDS): SDS相比于C语言的原生字符串,提供了自动内存管理和预分配机制。当字符串长度增加时,SDS会预先分配额外的空间,以减少内存重新分配…...
Vue2:router-link的replace属性
一、情景说明 我们在用浏览器访问网站的时候 知道浏览器会记录访问的历史路径,从而,可以退回到之前的页面 那么,Vue项目中的路由组件,通过router-link跳转,也是可以退回的 这里,我们用replace来屏蔽退回的…...
普中51单片机(DS18B20温度传感器)
DS18B20温度传感器原理 内部结构 64位(激)光刻只读存储器 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身…...
2.23C语言学习
P1480 A/B Problem 高精度数除以非高精度数 #include<bits/stdc.h> long long b[66660],c[66660],sum0; char a[66660]; int n; int main(){scanf("%s",a);scanf("%d",&n);int lenstrlen(a);for(int i1;i<len;i){b[i]a[i-1]-0;}for(int i1;…...
origin/master master
这里实际上有三件事:origin master是两件事,origin/master一件事。共计三件事。 两个分支: master 是一个本地分支 origin/master是远程分支(它是名为“origin” 的远程分支的本地副本,名为“master”) 一个…...
【数据结构】时间复杂度与空间复杂度
目录 时间复杂度 空间复杂度 时间复杂度 算法的时间复杂度并不是指一个代码运行时间的快慢,因为在不同机器上运行的时间肯定不同,因此算法的时间复杂度指的是基本操作的执行次数,他是一个数学意义上的函数。这个函数并不是C语言中那种函数&…...
分别使用js与jquery写 单击按钮时出现内容 点击删除按钮不会再向下出现
HTML部分 <body><button id"btn">单击我</button><button id"delAll">删除所有事件</button><div id"test"></div> </bady>jQuery代码 <script type"text/JavaScript" src"…...
【Git】Git命令的学习与总结
本文实践于 Learn Git Branching 这个有趣的 Git 学习网站。在该网站,可以使用 show command 命令展示所有可用命令。你也可以直接访问网站的sandbox,自由发挥。 一、本地篇 基础篇 git commit git commit将暂存区(staging areaÿ…...
前端工程化面试题 | 18.精选前端工程化高频面试题
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
大公司的工程师是怎么废掉的...
大家好,我是砖一。 此文作者以嵌入式工程师为基本视角,细说了从初阶到高阶工程师的资质需求,并提示工程师职业道路上的陷阱。可供参考。 一,基础知识 一个嵌入式工程师,很多都是从51单片机或者STM32单片机开始&…...
将yolov8权重文件转为onnx格式并在c#中使用
yolo模型转ONNX 在yolov8中,我们将训练结果的.pt权重文件转换为onnx格式只需要使用ultralytics库中的YOLO类,使用pip安装ultralytics库,然后执行下面python代码 from ultralytics import YOLO# 加载YOLOv8模型 model YOLO("best.pt&q…...
在Spring Boot启动时禁止自动配置数据源相关的组件、@SpringBootApplication
一、SpringBootApplication(exclude {DataSourceAutoConfiguration.class})注解 在Spring Boot启动时禁止自动配置数据源相关的组件。 SpringBootApplication(exclude {DataSourceAutoConfiguration.class})注解的使用案例 这个注解通常应该写在微服务项目的主启动类上&…...
程序人生:不积跬步无以致千里
程序人生 癸卯年冬月,往渭南韩城,拜访司马迁祠。入门攀爬而上,至人有困乏之时,抬头现:高山仰止。归路下山,始现三官洞,遥想西汉时三官洞,出口处刻意再拜别:高山仰止。泪…...
通过二叉树例题深入理解递归问题
目录 引入: 例1:二叉树的前序遍历: 例2: N叉树的前序遍历: 例3:二叉树的最大深度: 例4:二叉树的最小深度 例5:N叉树的最大深度: 例6:左叶子…...
【Android 协程常见用法】
我们这里只讲解一下,协程在Android项目中常见用法,原理知识不在进行说明了。 依赖 lifecycleScope只能在Activity、Fragment中使用,会绑定Activity和Fragment的生命周期。依赖库: implementation androidx.lifecycle:lifecycle…...
python 进程笔记一 (概念+示例代码)
1. 进程的概念 进程是资源分配的最小单位,也是线程的容器,线程(python 线程 (概念示例代码))是CPU调度的基本单位,一个进程包括多个线程。 程序:例如xxx.py是一个程序 进程…...
各中间件数据库默认访问端口总结
说明 在生态丰富的开发环境下,我们常常需要接触很多中间件产品,中间件默认的连接端口以及可视化ui访问端口也时不时的需要用到,这里循序渐进做好登记,以备查阅! 中间件/数据库名称默认端口管理台端口默认账号密码rabbi…...
鲲鹏arm64架构下安装KubeSphere
鲲鹏arm64架构下安装KubeSphere 官方参考文档: https://kubesphere.io/zh/docs/quick-start/minimal-kubesphere-on-k8s/ 在Kubernetes基础上最小化安装 KubeSphere 前提条件 官方参考文档: https://kubesphere.io/zh/docs/installing-on-kubernetes/introduction/prerequi…...
python 函数-02-返回值注释格式
01 函数返回值 1)python中函数可以没有返回值,也可以有通过return的方式 – 【特殊性,区别于java c#等】 2)返回值可以是一个或者多个,多个时通过逗号隔开 – 【特殊性,区别于java c#等】 3)多…...
【前端素材】推荐优质后台管理系统Upcube平台模板(附源码)
一、需求分析 后台管理系统在多个层次上提供了丰富的功能和细致的管理手段,帮助管理员轻松管理和控制系统的各个方面。其灵活性和可扩展性使得后台管理系统成为各种网站、应用程序和系统不可或缺的管理工具。 当我们从多个层次来详细分析后台管理系统时࿰…...
视频解析工具:高效获取无水印视频的技术实践与生态构建
视频解析工具:高效获取无水印视频的技术实践与生态构建 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容创作与研究领域,视频资源的高效获取已成为基础需求。然而平台访问限…...
A-59F 多功能语音处理模组:覆盖全场景人群,让每一次语音都清晰无噪
在门禁对讲、会议扩音、车载通话、导游喊话、监护设备、智能工牌等各类语音设备中,啸叫刺耳、环境嘈杂、回音不断、拾音模糊、通话断续是所有人共同的痛点。一款真正解决问题的核心硬件 ——A-59F 多功能语音处理模组,它集成扩音防啸叫、AI ENC 降噪、AE…...
电商数据采集API接口||合规优先、稳定高效、数据精准
一、API 类型选型(先选对,再做对)优先按 “官方 → 第三方聚合 → 自建” 顺序选择,平衡合规、成本与效率:表格API 类型代表平台核心优势适用场景注意事项官方开放 API淘宝 TOP、京东万象、拼多多开放平台、亚马逊 SP-…...
Windows虚拟控制器驱动完全指南:如何用ViGEmBus实现游戏设备模拟
Windows虚拟控制器驱动完全指南:如何用ViGEmBus实现游戏设备模拟 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾因游戏只支持特定手柄而…...
Trelby:释放创意生产力的剧本创作解决方案
Trelby:释放创意生产力的剧本创作解决方案 【免费下载链接】trelby The free, multiplatform, feature-rich screenwriting program! 项目地址: https://gitcode.com/gh_mirrors/tr/trelby 当格式规范不再成为创作的枷锁,编剧如何重获灵感自由&am…...
Simple Runtime Window Editor:突破窗口分辨率限制的技术实现与应用指南
Simple Runtime Window Editor:突破窗口分辨率限制的技术实现与应用指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 一、场景化问题诊断:分辨率调整的现实挑战 1.1 专业设计工作流的…...
OpenClaw多模态飞书助手:Qwen3-VL:30B实战详解
OpenClaw多模态飞书助手:Qwen3-VL:30B实战详解 1. 为什么需要多模态飞书助手? 去年夏天,我负责一个跨部门协作项目时,每天要处理上百条飞书消息。最头疼的是同事发来的各种截图——有的是数据报表需要整理,有的是会议…...
MaterialSkin 2:WinForms应用的Material Design现代化解决方案
MaterialSkin 2:WinForms应用的Material Design现代化解决方案 【免费下载链接】MaterialSkin 项目地址: https://gitcode.com/gh_mirrors/mat/MaterialSkin 在传统Windows Forms应用程序面临界面陈旧、用户体验落后的挑战下,WinForms现代化改造…...
Mysql是怎么加锁的?
原文地址https://www.xiaolincoding.com/mysql/lock/how_to_lock.html#%E4%BB%80%E4%B9%88-sql-%E8%AF%AD%E5%8F%A5%E4%BC%9A%E5%8A%A0%E8%A1%8C%E7%BA%A7%E9%94%81 我只是精简一下做个记录 这篇汇总将基于 MySQL 8.0 的 InnoDB 引擎,在 可重复读(Repe…...
2026年AI智能体大爆发:下一个十年风口,普通人的超级财富密码
比尔盖茨曾断言:“AI智能体(AI Agent)将彻底改变人们使用计算机的方式。”如果说2023年是大语言模型(LLM)的启蒙元年,那么到2026年,具备“感知-规划-行动”自主闭环能力的AI智能体将迎来真正的商…...
