Redis中String数据类型原理实现

Redis的基本数据类型及其底层实现原理 最近去面试,面试官都会先问:Redis中有哪些数据类型?接着就会问你知道某个类型的底层实现么?现在一块来了解下。 ​ 四、Redis支持的6种数据类型 三种特殊数据类型: 1.geospatial: Redis 在 3.2 推出 Geo 类型,该功能可以推算出地理位置信息,两地之间的距离。 2.hyperloglog:基数:数学上集合的元素个数,是不能重复的。这个数据结构常用于统计网站的 UV。 3.bitmap: bitmap 就是通过最小的单位 bit 来进行0或者1的设置,表示某个元素对应的值或者状 阅读详情

微信公众号:Java患者
专注Java领域技术分享

String 数据模型

首先Redis是KV数据结构,跟JDK中的Map是一样的,Redis是通过hashtable实现的,我们把这个叫做外层的哈希,那么每一个KY就是一个entry,在Redis的源码中,是定义为一个dictEntry。

typedef struct dictEntry {
    void *key;
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
    struct dictEntry *next;
} dictEntry;

通过源码 定义了dictEntry对象,对象中存储了一个key,跟一个value,并且还有一个指向了下一个键值对节点的对象。

接着了解key-value的原理,key是一个字符串,在C语言中(Redis是用C语言开发的),是没有字符串这个数据类型的,只有字符类型,而key并没有直接使用了C语言中的字符数组char[]来实现,而是存储在了一个自定义的数据类型-SDS。

value并没有存在SDS中,也不是作为字符串存储,而是存储中一个redisObject中,事实上,redis的五大数据类型的value都是存储在redisObject中。、

SDS

什么是SDS?Redis中字符串的实现,SDS有多种结构:sdshdr5、sdshdr8、sdshdr16、sdshdr32、sdshdr64,用于存储不同长度的字符串,分别代表的是2^5byte、2^8byte、2^16byte、2^32byte、2^64byte。

typedef char *sds;
......
struct __attribute__ ((__packed__)) sdshdr8 {
    uint8_t len;  /* 当前字符数据的长度 */
    uint8_t alloc; /* 当前字符数组总共配的内存大小 */
    unsigned char flags; /* 当前字符数据的属性 (sdshdr5、sdshdr8、sdshdr16、......) */
    char buf[]; /* 字符串真正的值 */
};
......

为什么要使用SDS来实现字符串呢?

  • 首先C语言中并没有字符串类型,要实现的话只能使用char[]来实现,但是使用字符数组必须先给变量分配足够的空间,否则会溢出,分配多了又可能造成浪费

  • 如果要获取字符串的长度,就需要遍历字符数组,时间复杂度高O(n)

  • 字符串的长度更改会对字符数组的内存进行重新分配

  • C语言的 \0 是字符串的标志结束位,如果存储图片音频等多媒体文件的时候,存在二进制安全问题

SDS的特点

  • 无需担心内存溢出的问题,如果需要就对SDS进行扩容

  • 定义了len属性,获取字符串长度时间复杂度O(1)

  • 通过“空间预分配” 和“惰性空间释放”,防止多次重分配内存

  • 判断字符串是否结束是len属性

redisObject

typedef struct redisObject {
    unsigned type:4; /* 对象的数据类型 (OBJ_STRING、OBJ_LIST、OBJ_HASH、OBJ_SET、OBJ_ZSET)*/
    unsigned encoding:4; /* 具体的数据结构 */
    unsigned lru:LRU_BITS; /* 对象最后一次被命令访问的时间 与内存回收有关 */
    int refcount;  /* 引用计数 当该变量值为0时,表示该对象不被任何其他对象引用,可以进行垃圾回收了 */
    void *ptr; /* 指针指向对象实际的数据结构 */
} robj;

数据模型图

专注分享Java技术,跟我一起学习吧

长按识别二维码关注

ASP内置对象详解 (六大对象) ASP内置对象详解 适合初学者 值得学习~~ 立即下载

相关推荐

[Csharp高级编程(第6版)]2章C#基础、3章对象和类型

中文版,Csharp高级编程(第6版),2章C#基础、3章对象和类型.pdf

C# 对象和类型

在 C# 中,对象(Object)和类型(Type)是面向对象编程中的重要概念。对象是一个实际存在的实体,它具有特定的属性和行为。在 C# 中,所有的数据都是通过对象来表示和操作的。对象可以是事物的具体实例,也可以是抽象的概念或概念模型的实例。类型是对象的蓝图或模板,用于定义对象的结构和行为。每个对象都属于一个特定的类型,它决定了对象可以具有的属性和可以执行的操作。在 C# 中,类型可以是内置类型(如整数、浮点数等,在 C# 基础篇中有简单的介绍),也可以是自定义的类、结构体、接口或枚举。

江江的博客 1670

Unity中URP下的菲涅尔效果实现(个性化修改)

在上篇文章中,我们实现了 URP 下的菲涅尔基础效果,我们在这篇文章中,对其进行自定义化修改。

楠溪泽岸的博客 2063

c# 对象类型、对象总结

对象的数据类型基本数据类型 int double bool ….. 引用数据类型 数组、对象、string(进行了特殊的处理)通过以上示例证明了对象是引用类型。基本数据类型(值类型)变量传递时,将自己复制一份ref关键字值类型的变量不能完全满足要求时,可以使用ref关键字将值类型变量按照引用方式传递,使得一个方法能够在传递一个参数时,又能将该参数修改后再次返回。 举例: 特别提示:实践开发中

Economic_shark的博客 3081

NVIDIA 2025 Board Design Engineer 校招笔试全解析:从基础门电路到理想放大器设计

本文详细解析了NVIDIA 2025届板级设计工程师校招笔试的核心考点与解题策略。内容涵盖从基础门电路、CMOS实现NOR门,到开关电源CCM/DCM模式波形分析与效率计算,以及理想运放电路设计与稳定性优化。旨在帮助考生构建硬件知识体系,掌握工程思维,顺利通过NVIDIA Board Design Engineer校招笔试。

weixin_29172201的博客 195

海思Hi3516DV300实战:从yolov5模型训练到Sort跟踪算法的完整部署流程

本文详细介绍了在海思Hi3516DV300芯片上部署YOLOv5目标检测与Sort多目标跟踪算法的完整流程。内容涵盖从特定场景数据训练YOLOv5模型、模型格式转换(PyTorch到ONNX再到Caffe),到利用海思NNIE引擎生成WK模型并进行端侧集成与优化的全链路实战经验,旨在解决嵌入式设备上实时人流量统计等实际应用挑战。

weixin_29034963的博客 336

C#基础--对象和类型

类包含成员,成员可以是静态成员或实例成员。静态成员属于类,实例成员属于对象。静态字段的值对每 个对象都是相同的。而每个对象的实例字段都可以有不同的值。静态成员关联了static修饰符。成员的种类如下 字段是与类相关的变量,一旦实例化PhoneCustomer对象,就可以使用语法Object.FieldName来访问这些字段,如下例所示: 只读字段 为了保证对象的字段不能改变,字段可以用readonly修饰符声明。带有readonly修饰符的字段只能在构造函数中分配值。它与const修饰符不同。编译器通过co

不求上进的码农的博客 2003

【C# + HALCON 机器视觉】HALCON经典算子:光流法运动分析(optical_flow_mg)

摘要:本文面向智能监控人流统计需求,研究C#与HALCON集成开发中optical_flow_mg算子的应用。通过RTSP获取视频流,利用光流法计算运动矢量,结合形态学操作与区域筛选实现行人区域分割,最终完成人流量统计与热力图可视化。详细阐述ROI局部处理等性能优化策略、try-catch异常捕获机制及跨平台集成方案。实验表明,该系统检测准确率达93.6%,单帧处理时间42ms,为公共场所人流量统计提供了完整可行的技术方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1441

C#中的值传递和引用传递是什么?

C#值类型数据直接在他自身分配到的内存中存储数据,而C#引用类型只是包含指向存储数据位置的指针。基础数据类型(string类型除外):包括整型、浮点型、十进制型、布尔型。整型包括:sbyte、byte、char、short、ushort、int、uint、long、ulong 这九种类型;浮点型就包括 float 和 double 两种类型;十进制型就decimal ;布尔型就是 bool 型了。...

weixin_30566111的博客 326

【机械臂视觉抓取从理论到实战】

首先声明一下,此项目是参考B站哈萨克斯坦UP的【机械臂视觉抓取从理论到实战】 此内容为他研究生生涯的阶段性成果展示和技术分享,所有数据和代码均开源。所以鹏鹏我特此来复现一下,我采用的硬件与之有所不同,UP主使用UR5,我实验室采用的是UR3,下面列出相关材料 UR3CB3.12:https://www.universal-robots.cn/cb3/ 【UR3系统升级到CB3.12附带URcap1.05】硬件支持代码支持 jacquard数据集:https://pan.baidu.com/s/1524HrV

vor234的博客 5180

学Simulink--机器人基础关节控制场景实例:基于Simulink的无刷直流电机(BLDC)关节六步换相位置控制仿真

本文详细介绍了基于Simulink的BLDC六步换相位置控制仿真方法,针对机器人关节的低成本控制需求。重点阐述了霍尔定位、六步换相和位置闭环三大核心原理,通过Simulink建模实现了从霍尔信号处理到位置环控制的全流程。仿真结果表明,该系统可实现0.3°的定位精度和80ms的响应时间,满足教育机器人等应用场景需求。文章还提供了核心代码模块和参数设置方法,并探讨了转矩脉动抑制、无传感器控制等进阶优化方向,为低成本机器人关节驱动提供了实用解决方案。

amy_mhd的博客 152

C#中对象和类型

开发工具与关键技术:对象和类型 作者:邓崇富 撰写时间:2019 年6 月 30 日 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 类和结构: 类和结构实际上都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法。类定义了类的每个对象(称为实例)可...

weixin_44548405的博客 984

2026 Claude Code 标准化前端UI SKILL——Frontend Design

是 Anthropic 官方开源的技能包,在 Claude 官方插件站中排名第一,超过 52k 的下载量。场景推荐方案快速体验批量安装官方 Skills深度设计策略叠加完整打磨流程集成终端跑claude一句话总结:Frontend Design 不是给 AI 加新能力,而是给 AI 加审美标准。它让 AI 从“能画”变成“会设计”——先想清楚风格,再动手写代码。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 3603

用过redis哪些数据类型?Redis String 类型的底层实现是什么?

跳表在创建节点时候,会生成范围为[0-1]的一个随机数,如果这个随机数小于 0.25(相当于概率 25%),那么层数就增加 1 层,然后继续生成下一个随机数,直到随机数的结果大于 0.25 结束,最终确定该节点的层数。Redis中的 Geo(Geoloaton的简写形式,代表地理坐标) 数据结构主要用于地理位置信息的存储,通过这个结构,可以方便地进行地理位置的存储、检索、以及计算地理距离等课作,GeO 数据结内存层使用了 Sorted set, 并结合了Geohash 编码算法来对地理位置进行处理。

SevenCoding的博客 761

向华为学习——IPD流程体系之IPD术语

《IPD体系核心概念与业务术语解析》摘要: IPD(集成产品开发)是一种以市场为导向的结构化产品开发管理模式,通过跨部门协作、异步开发、CBB(通用构建模块)和管道管理等手段,实现产品全生命周期高效管理。体系包含七大核心要素:跨部门团队(如IPMT决策层、PDT执行层)、结构化流程(分阶段评审)、端到端项目管理(WBS分级计划)、客户需求分析、投资组合优化及质量管控(TR技术评审)。各业务领域术语涵盖财务(NPV、IRR)、开发(需求分解、基线化)、制造(可制造性设计)、采购(Sourcing团队)及市场(

cdfunlove的博客 479

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【 Redis五大数据类型实现原理】

键不同,值相同。

2401_86968712的博客 2543

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Redis】Redis 底层数据结构、五种数据类型

当我们执行命令setbit key 7 0的时候,相当于把字符0x33变成了0x32,这样字符串的值就变成了”22”。而value则比较复杂,为了在同⼀个dict内能够存储不同类型的value,这就需要⼀个通⽤的数据结构,这个通用的数据结构就是robj,全名是redisObject。String的内部存储结构⼀般是sds(Simple Dynamic String,可以动态扩展内存),但是如果⼀个String类型的value的值是数字,那么Redis内部会把它转成long类型来存储,从⽽减少内存的使用。

奶酪的博客 3240

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

深入浅出Redis:一文掌握Redis底层数据结构与实现原理

Redis之所以高效,不仅在于它的内存操作,更在于巧妙的数据结构设计。本文带你揭开Redis底层数据结构的神秘面纱,包括动态字符串SDS如何解决C语言字符串问题、IntSet如何高效处理整数集合、Dict哈希字典如何快速实现键值对存储与扩容、ZipList如何节省空间但又引发“连锁更新”的问题、QuickList如何兼具空间高效与操作性能、SkipList跳表如何做到类似红黑树的查询效率,以及RedisObject如何统一不同类型的数据存储。在阅读完本文后,你将对Redis数据结构的设计思想与源码实现原理有

weixin_47762494的博客 8728

redis数据类型原理及应用

redis数据类型以及底层结构和原理

qqrrjj2011的博客 1099

【起】Redis 基础篇——基本数据结构之String,Hash

前言 距离过年那会闲在家更新的 MySQL 系列已经过去一段时间了,这段时间一直在忙其他的,所以博客的更新也就搁置了,但是一直在想着要更新啥内容比较好,刚好朋友给了我一本 Redis 的书籍,我就打算看完结合官方的文档总结一下,分享给大家,如果有什么不对的地方请指正。 Redis 系列,我想以“起承转合”的形式来更新,不过不一定是四篇噢,因为篇幅有限,太长怕你们没有耐心看完,可能《起》篇就分为几篇博文来叙述了,我也会对其进行规整,方便大家看完能更好的吸收,毕竟写文章的我能得到各位观看我的文章,是我的荣幸,我

weixin_42669785的博客 598

Redis常用数据类型的底层实现

redis常用数据类型的底层实现!!!

m0_63512120的博客 967

Redis五种数据类型底层实现

Redis数据库结构 Redis 是支持多key-value数据库(表)的,并用 RedisDb 来表示一个key-value数据库(表). redisServer 中有一个 redisDb *db成员变量, RedisServer 在初始化时,会根据配置文件的 db 数量来创建一个 redisDb 数组. 客户端在连接后,通过 SELECT 指令来选择一个 reidsDb,如果不指定,则缺省是...

qq_29860591的博客 1233

Redis的五种数据类型底层实现原理

前言 Redis的五种数据类型底层实现原理章节摘抄自: Redis的五种数据类型底层实现原理是什么 正文 Redis是一个Key-Value型的内存数据库, 它所有的key都是字符串, 而value常见的数据类型有五种:string, list, set, zset, hash。 Redis的这些数据结构, 在底层都是使用redisObject来进行表示。redisObject中有三个重要的属性, 分别是type、 encoding 和 ptr。 type : 保存的value的类型 encoding :

zzsan的博客 681

redis的5种数据结构及其底层实现原理

redis中的数据结构 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(无序集合)及zset(有序集合)。 在秒杀项目里,我用过redis的Set和Hash结构: String:一个 key 对应一个字符串,string是Redis 最基本的数据类型。(字节的abase框架只实现了redis的string数据结构,导致我们如果想要存储复杂的数据结构的时候,只能转成json格式的字符串来存储) list:一个 key 对应一个字符串列表,底层使用双向链表实现

zhongzhh8的博客 3万+

Redis 的五种数据类型及其底层原理

Redis是 key-value结构的数据库。 Redis常用的五种数据类型分别是:String、List、Set、Hash、Zset。 一、Redis五种类型的常用命令 1.1 String String是 redis 最基本的数据类型。一个 key 对应一个value。redis的String可以表示任何数据,比如 jpg图像或者序列化的对象,String的最大值能存储512MB。 常用命令: get、set、incr、decr、mget set:往redis里输入key-value,如:

ZJE 3万+

Redis数据结构(常用5+4种特殊数据类型)

我画了一张 Redis 数据类型和底层数据结构的对应关图,左边是 Redis 3.0版本的,也就是《Redis 设计与实现》这本书讲解的版本,现在看还是有点过时了,右边是现在 Redis 7.0 版本的。String 类型的底层的数据结构实现主要是 SDS(简单动态字符串)。List 类型的底层数据结构是由。Hash 类型的底层数据结构是由。Zset 类型的底层数据结构是由。Set 类型的底层数据结构是由。String 类型内部实现。List 类型内部实现。Hash 类型内部实现。Set 类型内部实现。

qq_37080455的博客 1716
上一篇: IDEA的Tomcat启动日志乱码
下一篇: Redis过期策略以及淘汰机制
新时代Java农民工
博客等级 码龄7年 16粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值