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

从零构建:ESP32S3无线DAP-Link调试器的硬件与软件协同设计

本文详细介绍了基于ESP32S3的无线DAP-Link调试器的硬件与软件协同设计,涵盖关键元器件选型、无线通信协议优化、双核任务处理及低功耗调试方案。通过ESP-NOW协议实现低延迟无线调试,结合USB协议栈与双核协同,为嵌入式开发提供高效灵活的调试解决方案。

gitlab7runner的博客 857

c# 对象类型、对象总结

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

Economic_shark的博客 3081

浙江大学Fast-Lab从0制作自主空中机器人公开课教程补充及部分注意事项(适用于ubuntu系统和ROS零基础)

浙江大学Fast-Lab从0制作自主空中机器人公开课纯萌新补充(适用于从没接触过ubuntu系统),记录了一些自己不会的地方以及踩过的坑

qq_39986834的博客 2984

Arcgis 10.3 与 ArcGIS Engine 10.3 安装与破解

Arcgis 10.3 与 ArcGIS Engine 10.3 安装与破解

weixin_52127098的博客 4724

C#基础--对象和类型

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

不求上进的码农的博客 2003

46、大数据助力SDN优化流量管理与控制器

本文探讨了大数据在软件定义网络(SDN)中的应用,重点分析了如何利用大数据技术优化SDN控制器的可扩展性和弹性。通过介绍SDN控制器的核心功能及其面临的挑战,提出了集中式、分布式、混合式和分层式控制器放置策略,并结合大数据分析系统架构与技术,详细阐述了在控制器放置优化、流聚合和备份路径识别等场景中的实际应用。文章还给出了大数据分析在SDN控制器优化中的操作流程与优势,展望了未来结合人工智能与物联网的发展方向,强调了数据安全与算法效率的重要性。

xx56789的博客 85

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

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

weixin_30566111的博客 326

Vue3 - 强力解决前端下载二进制流pdf文件、下载成功后打开空白问题解决,或者获取PDF文件流,将blob对象转换成下载链接打开后一片空白(无论是否使用pdf插件下载,还是原生方法下载都完美解决)

vue3前端下载二进制流pdf文件,下载成功,打开空白问题解决,js下载PDF文件流,打开空白问题,VUE3 h5中的文件流下载和指定的url下载总结(解决下载后的pdf打开空白情况)pdfjs打开文件流空白,解决pdf文件流,预览全是空白页,pdf文件流,下载正常,但是预览全是空白页,前端JS获取PDF文件流,将blob对象转换成下载链接打开后一篇空白的问题,前端文件流下载后文件空白,前端下载文件流PDF文件显示空白 或 无法打开,在线预览PDF文件打不开白屏怎么办,前端axios请求二进制数据流转换生成

🏆 前端领域优质创作者 4615

【ARM CoreLink 系列 7 -- TZC-400控制器简介】

为了确保内存能够正确识别总线的信号控制位,新增一个TrustZone地址空间控制器(TrustZone Address Space Controller,TZASC)组件来实现对内存地址的安全扩展,将内存区域划分为安全内存区域和非安全内存区域,安全世界可以访问安全内存和非安全内存,而普通世界只能访问非安全内存,如下图所示:图 1-1内存区域的划分是在系统启动时通过配置 TZASC 组件(TZC-400/TZC-380)来实现的。TZC-400由和使能情况;安全访问权限;Base地址;

CodingCos的博客 1632

C#中对象和类型

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

weixin_44548405的博客 984

OpenClaw 生成测试用例

OpenClaw 只是躯干,Skills 才是灵魂。很多同学觉得 OpenClaw 没用,就像是买了一台顶级电脑却没装操作系统。通过这四步走,不仅可以学会如何让 AI 干活,更重要的是,可以学会如何管理 AI 的能力。

十二测试录 737

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

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

SevenCoding的博客 761

Xilinx DDR3 MIG IP核设计--汇总导航

快速上手Xilinx DDR3 IP核----汇总篇

孤独的单刀 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

键不同,值相同。

2401_86968712的博客 2543

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

奶酪的博客 3240

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深入浅出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、付费专栏及课程。

余额充值