Redis数据结构对象之字符串对象

字符串对象

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

如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串对象会将整数值保存在字符串对象结构的ptr属性里面(将void *转换成long),并且将字符串对象的编码设置为int
举个例子,如果执行以下SET命令,那么服务器将创建一个如图所示的int编码的字符串对象作为number键的值:

127.0.0.1:6379> SET number 10086
OK
127.0.0.1:6379> OBJECT ENCODING number
"int"

在这里插入图片描述

如果字符串对象保存的是一个字符串值,并且这个字符串值的长度大于(3.2版本之前是39字节,之后变成44字节,后面再分析),那么字符串对象将使用简单动态字符串(SDS)来保存这个字符串,并将对象的编码设置为raw.举个例子,如果执行以下命令,那么服务器将创建一个如图所示的字符串对象作为story键的值:

127.0.0.1:6379> SET stroy "Long, long, long,  ago, there, lived, a, king, 123456789987654321"
OK
127.0.0.1:6379> STRLEN stroy
(integer) 65
127.0.0.1:6379> OBJECT ENCODING stroy
"raw"

在这里插入图片描述
如果字符串对象的保存的是一个字符串值,并且这个字符串值的长度小于等于(39或44字节),那么字符串对象将使用embstr编码的方式来保存这个字符串值。embstr编码是专门用于保存短字符串的一种优化编码方式,
这种编码和raw编码一样,都是用redisObject结构和sdshdr结构来表示字符串对象,但raw编码会调用两次内存分配函数来分别创建redisObject结构和sdshdr结构,而embstr编码则通过调用一次内存分配函数来分配
一块连续的空间,空间中依次包含redisObject和sdshdr两个结构,如图所示。

embstr编码的字符串对象在执行命令时,产生的效果和raw编码的字符串对象执行命令时产生的效果时相同的,但使用eembstr编码将创建字符串对象来保存短字符串值有以下好处:

  • 1.embstr编码将创建字符串对象所需的内存分配次数从raw编码的两次降低为一次。
    +2.释放embstr编码的字符串对象只需要调用一次内存释放函数,而释放raw编码的字符串对象需要调用两次内存释放函数
  • 3.因为embstr编码的字符串对象的所有数据都保存在一块连续的内存里面,所以这中编码的字符串对象比起raw编码的字符串对象比起raw编码的字符串对象能够更好地利用缓存带来的优势。
    在这里插入图片描述
    举个例子,以下命令创建了一个embstr编码的字符串对象作为msg键的值,值对象的样子,
127.0.0.1:6379> SET msg "hello"
OK
127.0.0.1:6379> OBJECT ENCODING msg
"embstr"

在这里插入图片描述

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

举个例子,执行以下代码将创建一个包好3.14的字符串表示"3.14"的字符串对象:

127.0.0.1:6379> SET pi 3.14
OK
127.0.0.1:6379> OBJECT ENCODINg pi
"embstr"

在有需要的时候,程序会将保存在字符串对象里面的字符串值转换回浮点数值,执行某些操作,然后再将执行操作所得的浮点数值转换回字符串值,并继续保存在字符串对象里面.

举个例子,如果执行以下代码:

127.0.0.1:6379> INCRBYFLOAT pi 2.0
"5.140000000000001"
127.0.0.1:6379> OBJECT ENCODING pi
"embstr"

那么程序首先会取出字符串对象里面保存的字符串值"3.14",将它转化回浮点数值3.14,然后再把3.14和2.0相加得出的值
5.14转换成字符串"5.14",并将这个"5.14"保存到字符串对象里面。
在这里插入图片描述

编码的转换

int编码的字符串对象和embstr编码的字符串对象在条件满足的情况下,会被转换为raw编码的对象。对于int编码的字符串对象来说,如果向对象执行了一些命令,使得这个对象保存的不再是整数值,而是一个字符串值。那么字符串对象的编码将从int变为raw.

另外,因为Redis没有为embstr编码的字符串对象编写任何相应的修改程序(只有int编码的字符串对象和raw编码的字符串对象有这些程序),所以embstr编码的字符串对象实际上是只读的。当对embstr编码的字符串对象执行任何修改命令时,程序会先将对象的编码从embstr转换成raw,然后再执行修改命令。因为这个原因,embstr编码的字符串对象在执行修改命令之后,总会变成一个raw编码的字符串对象。

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

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

以下代码展示了一个embstr编码

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为啥这么做实现不了优雅关闭服务,gin 项目

所谓的优雅关闭服务就是 在关闭服务时,服务不再监听新的请求,并且可以将之前的请求处理完毕。 细节请看 专栏博客Gin项目实战09-优雅关闭服务

【Cute】MMA抽象代码理解 c2d9bff3d88846eb8c523fb722166bc9

【Cute】MMA抽象代码理解 导读: cute 之 Layoutcute Layout 的代数和几何解释cute 之 Tensorcute 之 MMA抽象cute 之 简单GEMM实现 阅读本文前建议先读上面reed大神的数篇文章,文本逻辑主要是针对具体的代码,记录一下自己学习过程中的理解…

Atlas200板卡部署车道线

本博客包含推理的准备和部署代码,一步步实现部署。 这个运行时生成的一个batch的数据,NCHW,就是输入的N,单图片推理就是1,把里面的数量改成1,但是你可以多生成一些bin图片放到校准文件夹中,更改输出文件名…

“城市绿肺诊断:集成GIS、RS、VORS模型、CCDM模型、geodetecto、GWR模型技术深入解析生态系统与城镇化协调发展“

基于GIS、RS、VORS模型、CCDM模型、geodetecto、GWR模型集成的生态系统健康的耦合协调分析 城市群是一国经济发展水平的象征,也是一国经济发展到一定阶段的标志,我国城市群建设体量不断增加,将成为全球经济的核心,中国城市群的建…

MyFileServer

靶场下载地址 https://download.vulnhub.com/myfileserver/My_file_server_1.ova 信息收集 # nmap -sn 192.168.56.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-24 22:07 CST Nmap scan report for 192.168.56.2 (192.168.56.2) Host is up (0.…

QML与C++通信

一、QML中如何使用C的类和对象 前提条件: 1.从 QObject 或 QObject 的派生类继承 2.使用 Q_OBJECT 宏 这两个条件是为了让一个类能够进入 Qt 强大的元对象系统(meta-object system)中,只有使用元对象系统,一个类的某些…

Vue2前端权限控制实战

在Vue2项目中,前端权限控制是保障应用安全性的重要环节。本文将介绍如何使用Vue2实现前端权限控制,包括页面路由权限控制和按钮级别的权限控制。 一、页面路由权限控制 页面路由权限控制主要是根据用户的角色或权限来决定其可以访问哪些页面。在Vue2中…

- 概述 - 《设计模式(极简c++版)》

本文章属于专栏《设计模式(极简c版)》 “如果我看得更远,那是因为我站在巨人的肩膀上。” -牛顿 本系列,主要结合个人经验,对《设计模式:可复用面向对象软件的基础》书中经典设计模式,用极简的语…

HarmonyOS NEXT应用开发—状态栏显隐变化

介绍 本示例介绍使用Scroll组件的滚动事件 onScroll 实现状态栏显隐变化。该场景多用于各种软件的首页、我的等页面中。 效果预览图 使用说明 加载完成后显示状态栏显隐变化页面,上下拖动屏幕,顶端状态栏出现显隐变化。 实现思路 在置顶位置使用sta…

文件夹秒变应用程序?别慌,数据恢复有妙招!

在日常使用电脑的过程中,我们有时会遇到一个令人头疼的问题:原本好好的文件夹突然变成了应用程序的图标,点击也无法正常打开。这种“文件夹变应用程序”的现象不仅让人感到困惑,还可能导致重要文件的丢失或损坏。那么,…

vite ts vue 项目提示 . Projects must list all files or use an include pattern.

vite ts vue 项目提示 . Projects must list all files or use an include pattern. 在引用一个 ts 的时候,提示如下: 需要在 tsconfig.node.json 文件中添加: {"compilerOptions": {"composite": true,"skipLibC…

变量命名之函数命名

变量命名: 变量命名和函数名命名 方式一:camel命名 因相骆驼脊背形象命名 大骆驼法:当变量名或函数名由一个或多个单词连接在一起的,从第一个单词首字母也大写了,后面每个单词都大写. 例子: HI_S32 HI_MPI_VI_SetDevAttr(VI_DEV ViDev,const VI_DEV_ATTR_S* pstDevAttr);HI_S…

Vue2(四):Vue监测数据的原理

一、先来看一个问题 添加一个按钮点击更新马冬梅的信息&#xff1a; <button click"gengxin">点击更新马冬梅的信息</button> methods:{gengxin(){this.person[1].name马老师,this.person[1].age50,this.person[1].sex男}} 下面这种方式就不能奏效&a…

【前端】-css的详解

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

信号(Linux)

信号 前言1. 引入2. 概念3. 初步认识ctrlc信号4. 硬件中断 一、信号的产生1. 键盘组合键2. kill命令3. 系统调用①kill②raise③ abort 4. 异常①异常产生信号②原理 5. 软件条件6. 小结 二、信号的保存1. 引入2. 原理3. 接口①信号集——sigset_t②sigprocmask③sigpending④使…

spring注解驱动系列--AOP探究一

一、AOP--动态代理 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 二、使用栗子 一、导入aop模块 <dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>4…

虚拟机开机字体变大,进入系统后字体模糊

问题 虚拟机开机字体变大&#xff0c;进入系统后字体模糊。 原因 虚拟机配置问题。 解决办法 修改配置为如下:

算法2贪心

1&#xff0c;贪心 1&#xff09;排队打水 #include<bits/stdc.h> using namespace std; const int N1002; int a[N]; int m,n,x0;//n表示人数&#xff0c;m表示水龙头的个数&#xff0c;x表示总时间数 int main(){ cin>>n>>m; for(int i1;i<n;i) {cin…

资深老鸟经验,性能测试-性能指标分析总结,一篇策底概全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试指标 1、…

CUDA国内有哪些可以替代吗?

在国内&#xff0c;CUDA作为NVIDIA推出的并行计算平台和API模型&#xff0c;在深度学习、图像处理、科学计算等领域具有广泛的应用和影响力。然而&#xff0c;随着国内技术的发展和对自主可控的需求增加&#xff0c;一些替代CUDA的方案也逐渐崭露头角。以下是一些国内可以替代C…