redis 从0到1完整学习 (十一):RedisObject 之 String 类型
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 <= allocflags
用来控制 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公众号:一个比特定乾坤
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!