字符串类型 在 Redis 中属于最常见也是最简单的数据类型,底层实现主要为 sds 简单动态字符串结构
字符串类型 底层实现为 简单动态字符串数据结构,所以是 二进制安全的,意味着可以存储任何格式数据,不过长度要求不能高于 512MB…
字符串对象结构
对象的基础知识可以查看上一篇文章(对象 object),字符串对象 的编码为 OBJ_ENCODING_RAW
、OBJ_ENCODING_INT
、OBJ_ENCODING_EMBSTR
,那么 字符串对象 结构如下
- 如果字符串对象保存的是 整数值,并且这个整数值可以用 long类型表示,那么 字符串对象会将整数值保存在字符串对象结构的 ptr 属性里( void 转为了 long 类型),并将 encoding 设置为
OBJ_ENCODING_INT
- 如果字符串对象保存的是 字符串,并且这个字符串长度
大于 44 字节(OBJ_ENCODING_EMBSTR_SIZE_LIMIT 常量控制)
,那么字符串对象使用 简单动态字符串结构 表示,并将 encoding 设置为OBJ_ENCODING_RAW
- 如果字符串对象保存的是 字符串,并且这个字符串长度
小于等于 44 字节(OBJ_ENCODING_EMBSTR_SIZE_LIMIT 常量控制)
,那么字符串对象使用 简单动态字符串结构 表示,并将 encoding 设置为OBJ_ENCODING_EMBSTR
而为什么同样是 字符串类型值,但是有的使用 raw 有的使用 embstr 呢?
embstr 编码为专门用于保存 短小字符串的优化编码方式
,跟 raw 一样都是基于 sds 简单动态字符串数据结构;在构建 字符串对象的时候,raw 会调用两次内存分配函数来分别创建 redisObject 结构 和 sds 结构,而 embstr 则是只调用一次内存分配函数 申请了一块连续的内存,依次包含 redisObject 和 sds 两个结构,实际产生功能效果是一样的;所以
- embstr 编码 比 raw 编码 在申请内存空间的时候 次数 -1,同样道理,释放内存的时候也只需要 调用一次内存释放函数
- embstr 编码的内存空间是 连续的,操作的时候更加便利
但是呢,embstr 只适合长度较小的字符串;如果长度过长,申请大内存段比较费力,因此,Redis 规定了小于规定字节才采用 embstr编码
下面我们就 Redis 字符串类型 一些典型的 API 进行解析~~~
源码解析
由于有些方法里的代码量比较大,我们这里按照 典型的代码片段进行解析,同志们可以根据文章提示的代码位置 和 代码里面的关键词 在源码中搜素,可能数据结构一些元素 看不太懂什么意思,没关系,先混个脸熟,后面看完回头再看过来就明白了
字符串类型的 命令对应处理文件为 t_string.c
查询功能
查询命令 get/getset
对应的 函数为 getCommand()
和 getsetCommand()
,在查询数据方面主逻辑函数是 getGenericCommand()
上面逻辑中查找元素部分使用了 lookupKeyReadOrReply()
函数,这个函数的主逻辑函数为 lookupKey()
mget
命令的逻辑跟 get
命令的逻辑基本类似,不过输出模式不太一样而已,需要多行输出
更新/添加 功能
更新/添加 功能的命令主要有 set
、setex
、setnx
等,主要功能函数为 setGenericCommand()
,不过 setCommand()
函数在处理也有一定的逻辑,我们一块进行解读……
注意 setCommand 的 过期时间expire 主要是这样的形式 SET foo1 hello EX 18600
命令格式:SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX second
设置键的过期时间为 second 秒;SET key value EX second 效果等同于 SETEX key second valuePX millisecond
设置键的过期时间为 millisecond 毫秒;SET key value PX millisecond 效果等同于 PSETEX key millisecond valueNX
只在键不存在时,才对键进行设置操作;SET key value NX 效果等同于 SETNX key valueXX
只在键已经存在时,才对键进行设置操作
|
|
|
|
本文作者: wettper
本文链接: http://www.web-lovers.com/redis-source-string.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!