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平台模板(附源码)
一、需求分析 后台管理系统在多个层次上提供了丰富的功能和细致的管理手段,帮助管理员轻松管理和控制系统的各个方面。其灵活性和可扩展性使得后台管理系统成为各种网站、应用程序和系统不可或缺的管理工具。 当我们从多个层次来详细分析后台管理系统时࿰…...
别再死记Ld≠Lq了!从磁路角度,手把手教你区分永磁同步电机的凸极与隐极
永磁同步电机:从磁路本质破解凸极与隐极的认知迷思 在电机工程领域,永磁同步电机(PMSM)的凸极与隐极特性常被简化为"Ld≠Lq"的数学表述,这种表面化的理解就像仅通过体温判断疾病一样片面。真正掌握这一概念需要深入磁路层面&#x…...
如何在iOS设备上快速安装TrollStore:TrollInstallerX完整使用指南
如何在iOS设备上快速安装TrollStore:TrollInstallerX完整使用指南 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX TrollInstallerX是一款专为iOS 14.0到16.6…...
专利数据分析实战:从高通5G专利预测看技术趋势与竞争情报
1. 项目概述:一场关于专利里程碑的预测游戏在科技行业,尤其是半导体和通信领域,专利不仅是技术实力的证明,更是商业竞争的护城河。2018年,美国专利商标局即将迎来一个历史性时刻:颁发第1000万件美国实用专利…...
多模型 API 聚合如何赋能智能体实现更复杂的决策与调度
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 多模型 API 聚合如何赋能智能体实现更复杂的决策与调度 在构建高级智能体系统时,单一的模型提供商往往难以满足所有场景…...
选择Token Plan套餐后在实际开发中感受到的成本控制优势
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 选择Token Plan套餐后在实际开发中感受到的成本控制优势 1. 从按量计费到固定额度的转变 在项目开发的早期阶段,尤其是…...
给每个 Agent 装上专属工具集:Multi-Agent 权限隔离的三种设计模式一次讲透
我第一次写多 Agent 系统时犯过一个错误:把所有工具塞进一个 tools 数组,然后把这个数组挂给每个 Agent。结果上线后发现:负责写文章摘要的 Agent,有时候莫名其妙地调用了删除接口;负责检索资料的 Agent,偶…...
终极图像超分辨率神器:waifu2x-caffe完整使用指南
终极图像超分辨率神器:waifu2x-caffe完整使用指南 【免费下载链接】waifu2x-caffe waifu2xのCaffe版 项目地址: https://gitcode.com/gh_mirrors/wa/waifu2x-caffe 你是否曾为低分辨率图片的模糊细节而烦恼?想要将心爱的动漫壁纸放大到4K分辨率&a…...
实战复盘:我是如何通过一个SSRF漏洞,利用Gopher协议拿下内网Redis的
从SSRF到内网Redis入侵:一次真实渗透测试的深度剖析 那天下午,我正在对某企业Web应用进行常规安全评估。一个看似普通的文件下载接口引起了我的注意——它接受URL参数并返回对应资源内容。直觉告诉我,这里可能存在SSRF漏洞。接下来的72小时&a…...
LeagueAkari游戏数据分析工具:从新手到高手的完整进阶攻略
LeagueAkari游戏数据分析工具:从新手到高手的完整进阶攻略 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾在英雄联盟游戏…...
从Hello-World到Nginx:5个真实案例详解如何让Docker容器在后台稳定运行
从Hello-World到Nginx:5个真实案例详解如何让Docker容器在后台稳定运行 当你在终端输入docker run后,容器却像一阵风一样消失无踪——这种"闪退"现象往往是Docker新手遭遇的第一个认知颠覆点。不同于传统虚拟机,容器本质上是隔离的…...
