【009】-Redis-数据结构-字符串介绍



点击

蓝色

字体催更



1

 字符串简介 

【009】-Redis-数据结构-字符串介绍

string 是 Redis 最基本也是最简单的数据结构。字符串也是 Redis 其他数据结构的组成部分,比如:Redis 中的 key 本身就是字符串。

更多关于 Redis 字符串的描述介绍,可以直接从 Redis 的英文官网或者中文官网得到。


2

 字符串操作

【009】-Redis-数据结构-字符串介绍

Redis 命令参考网站中能够查阅到字符串内的相关的操作指令,该文档罗列了字符串相关的操作指令,时间复杂度,指令描述,指令参数选项以及参数的注释说明,还有使用案例。

鉴于文档的一个完整性,这里不进行展开,相信大家通能够看懂,不过为了后期视频的连续性,简单的演示几个基本的操作指令。

首先就是字符串的存取操作。对应的是 set 命令,对应的是 get 命令

往 redis 中存入两个值:名字,年龄

set name hhyyset age 18

从 Redis 中读取字符串的值

get name get age

关于字符串的操作演示就这两个,一个存一个取,更多的操作可以直接参考文档自行进行操作。


3

 字符串数据结构 SDS

SDS简介

Redis 的字符串存储并没有采用c原生的字符串,而是自己定义字符串的结构定义,叫做 SDS(simple dynamic String) 简单动态字符串。

Redis 中的字符串有三种编码格式。分别是 int、embstr、raw

这三种编码格式除了 int 之外,embstr 和 raw 格式都是用 sds 来进行存储。


为什么 int 被排除在外,因为会使用int编码格式存储字符串表示该字符串是一个在指定范围内的整数值,占用的空间较小,针对这种情况,Redis 直接在该字符串所在redisObject 中的 ptr 所在空间进行存储。无需在使用 SDS 数据结构来进行存储。


来看一下 SDS 一个结构定义。关于 Redis 底层字符串存储的结构抽象图如下:


【009】-Redis-数据结构-字符串介绍

图中描述 sds 结构的4个字段

  1. buf[]:字符串,真正存储的位置

  2. len:当前 buf 数组中存储字符串的最大长度

  3. alloc:这个 buf数组最大能够存储多长的字符串

  4. flags:表示 sds 的类型

【009】-Redis-数据结构-字符串介绍

小贴士

flags作用:用来区分多个 SDS 结构。

【009】-Redis-数据结构-字符串介绍

SDS 源码结构定义

sds.h 源码文件中

【009】-Redis-数据结构-字符串介绍

`sds`的结构 定义了5种,除 sdshdr5 外其他的四种结构是一样的,sdshdr5 可以不用看,因为在代码实现中判断如果需要使用sdshdr5l来存储代码会直接将其替换成sdshdr8

如何区分五种 SDS 结构?

多种 SDS 结构的区分,由 flags 字段来区分,来看一下 flags 的属性值定义,同样是在 sds.h 源码文件中

【009】-Redis-数据结构-字符串介绍

一个 flags 值对应一个 SDS 数据结构,以此来区分不同的 SDS 结构类型。

除 sdshdr5,其他四种SDS结构有啥区别?

通过对比 SDS 结构定义,能够知道不同的 SDS 结构定义对应的属性单位不一样,比如 sdshdr8 sdshdr16

【009】-Redis-数据结构-字符串介绍

这两个 SDS 结构在 len 和 alloc 的定义单位上不同。

【009】-Redis-数据结构-字符串介绍

unit8_t 占用的空间比 unit16_ 占用的空间大。

变量一旦定义,无论是否使用都需要开辟出相应的内存空间,也就是说,在未进行存储数据时,sdshdr16 单结构定义占用的内存就比 sdshdr8 大。

SDS叫做动态字符串的原因

五种 SDS 结构初始化在没有存储数据前,它们所占用的空间是不一样的,五种 SDS 数据结构占用空间对比如下:

sdshdr5 < sdshdr8 < sdshdr16 < sdshdr32 < sdshdr64

不过 SDS 占用的空间越大,表示 SDS 结构中 alloc 字段能够表示的数值越大,那么该  SDS 结构允许的最大字符串存储也就越大。


Redis 根据需要存储的字符串判断其长度,选择最合适的 SDS 结构进行存储,以此达到节省内存空间的目的。这就是 Redis 的简单动态选择,所以叫简单动态字符串。

【回复:Redis资料包】 

获取相关 Redis 资料,资料实时更新….

往期推荐





【006】-Redis-Docker启动单实例服务



【007】-Redis-Redis 六种数据结构简介



【008】-Redis-数据结构-redisObject

end



【009】-Redis-数据结构-字符串介绍

扫码催更

获取资料

小视频

【009】-Redis-数据结构-字符串介绍

来源:花好夜猿,本文观点不代表自营销立场,网址:https://www.zyxiao.com/p/73491

发表评论

登录后才能评论
侵权联系
返回顶部