redis 从0到1完整学习 (十一):RedisObject 之 String 类型

发布时间:2023年12月29日


1. 引言

前情提要:
《redis 从0到1完整学习 (一):安装&初识 redis》
《redis 从0到1完整学习 (二):redis 常用命令》
《redis 从0到1完整学习 (三):redis 数据结构》
《redis 从0到1完整学习 (四):字符串 SDS 数据结构》
《redis 从0到1完整学习 (五):集合 IntSet 数据结构》
《redis 从0到1完整学习 (六):Hash 表数据结构》
《redis 从0到1完整学习 (七):ZipList 数据结构》
《redis 从0到1完整学习 (八):QuickList 数据结构》
《redis 从0到1完整学习 (九):SkipList 数据结构》
《redis 从0到1完整学习 (十):RedisObject 数据结构》

上一节整体讲了 RedisObject 的数据结构,能灵活地处理不同类型和大小的数据,本文主要介绍 RedisObject 是如何管理 String 类型的数据结构的。

2. redis 源码下载

Redis 源码可以点击这里下载,方便查看其中定义的一些数据结构。
在这里插入图片描述

3. redisObject 管理 String 类型的数据结构

上篇讲过 Redis 使用一种名为 redisObject 的数据结构来管理所有类型的值,包括 String 类型,具体可参考 《redis 从0到1完整学习 (十):RedisObject 数据结构》。每个存储在 Redis 中的值都由一个 redisObject 结构体表示,数据结构回忆一下:
在这里插入图片描述

对于 String 类型的数据,基于 SDS 实现,存储上限为512MB,SDS 数据结构可参考《redis 从0到1完整学习 (四):字符串 SDS 数据结构》,放张图回忆下 SDS 的数据结构:
在这里插入图片描述

  • len 表示字符数组真实的长度(不包含\0)
  • alloc 表示已经分配的大小(不包含\0),len <= alloc
  • flags 用来控制 SDS 的 Header 大小

那么 redisObject 管理 String 类型的数据,各个数据结构字段如下:

  • type: 表示值的类型,对于 String 类型,该字段的值为 OBJ_STRING。
  • encoding: 表示值的编码方式。对于 String 类型,有以下三种编码方式:
    • REDIS_ENCODING_INT: 当字符串表示的是一个整数值,并且这个整数值可以在 long 类型范围内表示时,Redis 会使用这种编码方式。在这种情况下,ptr 字段直接存储整数值,节省了内存。
    • REDIS_ENCODING_EMBSTR: 当字符串长度较小(通常小于等于 44 字节)时,Redis 会将 redisObject 结构体和 SDS 字符串结构体合并在一起,形成一个连续的内存块,这可以减少内存碎片。
    • REDIS_ENCODING_RAW: 当字符串长度较大时,Redis 会使用独立的 SDS 字符串结构体来存储字符串内容。ptr 字段指向这个 SDS 结构体。
  • ptr: 指向实际的值。对于不同编码方式,ptr 的含义不同。

把上面解释的文字转换成图,如下:
在这里插入图片描述

4. 参考

《redis 从0到1完整学习 (一):安装&初识 redis》
《redis 从0到1完整学习 (二):redis 常用命令》
《redis 从0到1完整学习 (三):redis 数据结构》
《redis 从0到1完整学习 (四):字符串 SDS 数据结构》
《redis 从0到1完整学习 (五):集合 IntSet 数据结构》
《redis 从0到1完整学习 (六):Hash 表数据结构》
《redis 从0到1完整学习 (七):ZipList 数据结构》
《redis 从0到1完整学习 (八):QuickList 数据结构》
《redis 从0到1完整学习 (九):SkipList 数据结构》
《redis 从0到1完整学习 (十):RedisObject 数据结构》

欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;

也欢迎关注我的wx公众号:一个比特定乾坤
在这里插入图片描述

文章来源:https://blog.csdn.net/qq_36803941/article/details/135282969
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。