Redis数据存储结构之String
前言:
在Redis使用中,我们最常使用的操作是set key value,或 get key value 。这里面包含了redis最基本的数据类型:String,字符串类型是redis中最基本的类型,它能存储任何形式的字符串,包括二进制数据(JSON,Image...)。
大家有没有思考过redis是通过何种数据结构来存储数据的呢?今天来带大家一探究竟。
源码打开方式:
打开我们下载好的redis源码包,进入src目录,思考,怎么才能知道哪一个是String的结构类型的源码呢? 然后我们慢慢找,慢慢找, 哪一个像String的结构类型的源码呢? 诶,大兄嘚, 找到了, 这个sds.c像是String的源码,哈哈哈哈哈哈哈哈哈哈哈哈哈,真是机智! 实时证明,这是一种效率极其低下的方式。
正确的打开源码的方式是,查找官方文档。在Redis官方页面中,有Quick links,有官方的Github. 我们进入GitHub。在GitHub中,有对源码的简要描述。我们通过往下翻,找到如下描述:
我们可以看到官方介绍的很清楚,sds.c是Redis的字符串库。接下来,我们就可以快乐的去看源码了。
源码剖析:
part1: sds.h
在源码包中,有sds.c和sds.h文件。在C语言中,.h文件一般为头文件,.c为源文件。在源文件中可以调用头文件中定义的变量,结构体,等一些数据或数据类型。所以我们先查看一下头文件定义的数据类型。
在文件头中定义了5种结构体,分别是:sdshdr5,sdshdr8,sdshdr16,32,64,每种结构体中的数据类型相同(当然,长度定义的不同)。每个参数具体的含义(暂时不考虑sdshdr5,上面写的很清楚,sdshdr5 is never used.):
- len:表示当前sds的长度,
- alloc:表示为sds分配的内存大小
- flag:用来表示当前sds的类型。如上图所示 001,010,011,100分别为8,16,32,64
- char buf[]:sds实际存放的数据
当然,头文件中还定义了许多方法,通过名称我们可以大概知其意。如:static inline size_t sdslen(const sds s) 获取sds的长度, static inline void sdsinclen(sds s, size_t inc) 长度+1,还有许多。
part2:sds.c
在sds.c中,引用了sds.h中定义的数据结构,已申明的方法和已实现的方法等。此文件中主要定义了对sds数据结构的具体操作,如:初始化方式,设置sds的len,等一些列操作,感兴趣的可以具体研究下源码。此处不一一详解啦(水平有限,误导不好)。
结束语
通过本文,了解了Redis中存储String类型采用的数据结构,以及数据结构中具体的数据,参数等,还有String 是如何操作的。希望对大家有帮助, 谢谢!
- 使用stringRedisTemplate操作redis hash结构数据只能存储String类型的问题
- redis之存储---数据结构
- redis中的数据类型及存储结构
- redis 数据结构一 之t_string
- Redis(一) 数据结构与底层存储 & 事务 & 持久化 & lua
- Redis之(二)数据类型及存储结构
- Redis 数据类型分析 字符串 哈希 列表 集合 有序集合 优缺点 分析 注意事项 存储结构
- redis 存储数据结构
- Redis之(二)数据类型及存储结构
- Redis学习笔记之二:Redis的数据存储结构
- Redis之(二)数据类型及存储结构
- YII2redis存储hash数据(mb_strlen() expects parameter 1 to be string, array given)
- redis 数据结构之和对象---简单动态字符串SDS(simple dynamic string)
- Redis中string数据存储类型
- redis 3.2 新数据结构:quicklist、String的embstr与raw编码方式分界点
- Redis-数据结构(字符串String)
- Redis的五种存储数据结构和常用命令
- 我知道点redis-数据结构与对象(对象)-对象存储
- redis 存储数据结构及持久化方式--rdb 、aof
- Redis存储数据类型一:String