redis之字符串

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 redis之字符串,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

引言

字符串对象的编码可以是int、raw或者embstr

int

如果一个字符串对象保存的是整数值,并且这个整数值可以用long 类型来表示,那么字符串对象会将整数值保存在字符串对象结构的ptr属 性里面(将void*转换成long),并将字符串对象的编码设置为int

redis之字符串

 举个例子

如果我们执行以下SET命令,那么服务器将创建一个如上图所示的int编码的字符串对象作为number键的值

redis> SET number 10086
OK
redis> OBJECT ENCODING number
"int"

raw

如果字符串对象保存的是一个字符串值,并且这个字符串值的长度 大于32字节,那么字符串对象将使用一个简单动态字符串(SDS)来保 存这个字符串值,并将对象的编码设置为raw

举个例子

如果我们执行以下命令,那么服务器将创建一个如下图所示的raw编码的字符串对象作为story键的值

redis之字符串

 

redis> SET story "Long, long ago there lived a king ..."
OK
redis> STRLEN story
(integer) 37
redis> OBJECT ENCODING story
"raw"

embstr

embstr编码是专门用于保存短字符串的一种优化编码方式,这种编码和raw编码一样,都使用redisObject结构和sdshdr结构来表示字符串对象

raw编码会调用两次内存分配函数来分别创建redisObject结构和 sdshdr结构,而embstr编码则通过调用一次内存分配函数来分配一块连续的空间

redis之字符串

 优点

·embstr编码将创建字符串对象所需的内存分配次数从raw编码的两 次降低为一次。

·释放embstr编码的字符串对象只需要调用一次内存释放函数,而释 放raw编码的字符串对象需要调用两次内存释放函数。

·因为embstr编码的字符串对象的所有数据都保存在一块连续的内存 里面,所以这种编码的字符串对象比起raw编码的字符串对象能够更好 地利用缓存带来的优势

举个例子

以下命令创建了一个embstr编码的字符串对象作为msg 键的值

redis> SET msg "hello"
OK
redis> OBJECT ENCODING msg
"embstr"

redis之字符串

 最后要说的是,可以用long double类型表示的浮点数在Redis中也是 作为字符串值来保存的。如果我们要保存一个浮点数到字符串对象里 面,那么程序会先将这个浮点数转换成字符串值,然后再保存转换所得的字符串值。

总结

redis之字符串

 编码的转化

int编码的字符串对象和embstr编码的字符串对象在条件满足的情况 下,会被转换为raw编码的字符串对象

对于int编码的字符串对象来说,如果我们向对象执行了一些命令, 使得这个对象保存的不再是整数值,而是一个字符串值,那么字符串对 象的编码将从int变为raw

举个例子

我们通过APPEND命令,向一个保存整数值的字 符串对象追加了一个字符串值,因为追加操作只能对字符串值执行,所 以程序会先将之前保存的整数值10086转换为字符串值”10086″,然后再 执行追加操作,操作的执行结果就是一个raw编码的、保存了字符串值 的字符串对象

redis> SET number 10086
OK
redis> OBJECT ENCODING number
"int"
redis> APPEND number " is a good number!"
(integer) 23
redis> GET number
"10086 is a good number!"
redis> OBJECT ENCODING number
"raw"

因为Redis没有为embstr编码的字符串对象编写任何相应的修 改程序(只有int编码的字符串对象和raw编码的字符串对象有这些程 序),所以embstr编码的字符串对象实际上是只读的

当我们对embstr 编码的字符串对象执行任何修改命令时,程序会先将对象的编码从 embstr转换成raw,然后再执行修改命令。因为这个原因,embstr编码的 字符串对象在执行修改命令之后,总会变成一个raw编码的字符串对 象

举个例子

redis> SET msg "hello world"
OK
redis> OBJECT ENCODING msg
"embstr"
redis> APPEND msg " again!"
(integer) 18
redis> OBJECT ENCODING msg
"raw"

终端命令大全

redis之字符串

redis之字符串 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/129595.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!