redis string底层为什么使用sds, sds好处?redis 的动态字符串优点?

news2024/12/25 9:47:49

1. redis 的键值对,都是由对象组成的,

    其中键总是一个字符串对象(string object)

    而键的value则可以是:“字符串对象”, “列表对象 (list object)”,“哈希对象 (hash object)”, “集合对象(set object)”, “有序集合对象(sorted set object)” 这五种对象集合中的一种!

2. 字符串的键值对,底层都是由两个sds对象组成的。

3. 简单动态字符串(simple dynamic string, SDS) 结构体:

 

3. sds 优点(较c 字符串优缺点): 

    a. 常数复杂度 获取字符串长度

         redis底层为c语言, 而c 语言中字符串,并没有对获取长度参数 进行方法封装,即获取长度,只能进行遍历,直至最后一位获取为空字符,这样时间复杂度比较高o(n) , sds 则是根据len 长度 来记录sds 本身的长度,获取时间复杂度为o (1)

   b. 杜绝缓冲区溢出 (我认为叫自动扩容)

      c 字符串不记录长度值,在进行字符串的拼接操作时,容易出现溢出。即两个字符串拼接时, 第二个字符串的字符会出现没有全部写入

       sds api 则是对于长度校验,如果两个即将拼接的长度超出,则进行扩容,扩展到所需要的大小

  c. 减少修改字符串时带来的内存重分配次数

       还是由于c 字符串没有 对于长度值得问题,如果这个字符串进行了增加或者删除操作,就会调用新得内存空间,这个调用比较耗时,比较重

      sds 则是实现了空间预分配和惰性空间释放策略

       空间预分配:简单来说我认为和hashmap 的扩容有点像,新增了一部分空间,留着以后用

       惰性空间释放: 用于优化sds的字符串缩短操作,就是如果空间多了,先不会释放,使用free属性,来进行记录,留着将来使用。避免缩短字符串带来的内存重分配操作,sds也有相应api ,如果有需要,可以释放sds 未使用的空间

d. 二进制安全(sds 底层数组为二进制数据,可存储任意格式数据)

    c语言 字符串必须符合某种编码规则(比如 ASCII),2. 中间数据不能包含空字符(约定为字符串为空是结尾, 如果有空则被认为结束!)这样会限制c字符串只能保存文本数据

    sds 存放在buf数组里的数据为二进制格式,(buf数组 存得不是字符,存的是二进制数据,sds api 方法内 进行了处理),所以sds 可以保存任意格式二进制数据

思考: sds 算不算是装饰器模式呢?增强了c 语言没有的功能,与方法

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

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

相关文章

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.3 月末操作:外币评估

2.6.3 月末操作:外币评估 企业的外币业务在记账时一般使用期初的汇率或者即时汇率,但在月末,需要按照月末汇率对外币的余额或者未清项进行重估(revaluation)。 企业在资产负债表日,应当按照下列规…

nandgame中的Code generation(代码生成)

题目说明: 代码生成为语言的语法规则定义代码生成,以支持加法和减法。 您可以使用在前面级别中定义的堆栈操作(如ADD和SUB)。代码生成模板通常需要包含规则中其他符号的代码。 这些可以通过方括号中的符号名称插入。例如&#xf…

【初中生讲机器学习】15. EM 算法一万字详解!一起来学!

创建时间:2024-04-08 最后编辑时间:2024-04-10 作者:Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~ 我是 Geeker_LStar,一名初三学生,热爱计算机和数学,我们一起加…

西门子PLC(S7-200 SMART)学习笔记1:初识PLC可编程逻辑器件

今日开始我的西门子PLC学习之路,学习的型号以S7-200 SMART为主 主要认识一下PLC是什么、型号怎么看、 通信相关、编程软件、构造及工作原理 目录 西门子官方PLC手册获取: 1、PLC可编程逻辑器件的基本认识: PLC的结构及各部分的作用&#xff…

Kali安装黑屏与进入系统后不显示中文的解决办法

使用镜像版本kali-linux-2024.1-installer-amd64.iso 一.创建虚拟机安装Kali镜像时,安装后要重启时发现左上角有个— 闪动并黑屏,启动不成功 上述办法也很简单,可以试试再windows中的CMD终端输入netsh winsock reset,重启电脑如果…

嵌入式Linux:Linux库函数

目录 1、Linux库函数简介 2、标准C语言库函数 1、Linux库函数简介 Linux 提供了丰富的库函数,涵盖了各种领域,从文件操作到网络编程、图形界面、数学运算等。这些库函数大多数都是标准的 C 库函数,同时也包括一些特定于 Linux 系统的库。 …

【Linux】初识Linux,虚拟机安装Linux系统,配置网卡

前言 VMware软件:首先,确保您已经下载了VMware Workstation软件并安装在电脑上。VMware Workstation是一款功能强大的虚拟化软件,它允许在单一物理机上运行多个操作系统。 Linux镜像文件:需要准备一个Linux操作系统的镜像文件。…

初学python记录:力扣1702. 修改后的最大二进制字符串

题目: 给你一个二进制字符串 binary ,它仅有 0 或者 1 组成。你可以使用下面的操作任意次对它进行修改: 操作 1 :如果二进制串包含子字符串 "00" ,你可以用 "10" 将其替换。 比方说,…

LWIP一探究竟

1.网卡接收数据的流程 我们网卡接收数据基本上就是开发板上eth接收完数据后产生一个中断,然后释放一个信号量通知网卡接收线程去处理这些接收的数据,然后将这些数据封装成信息,投递到tcpip_mbox邮箱中,LWIP内核线程得到这个消息,就对消息进行解析,根据消息中数据包类型进行处理…

docker使用canal

1. 准备MySql主库 1.1.在服务器新建文件夹 mysql/data,新建文件 mysql/conf.d/my.cnf 其中my.cnf 内容如下 [mysqld] log_timestampsSYSTEM default-time-zone8:00 server-id1 log-binmysql-bin binlog-do-db mall # 要监听的库 binlog_formatROW配置解读&#…

Harmony鸿蒙南向驱动开发-Regulator

Regulator模块用于控制系统中各类设备的电压/电流供应。在嵌入式系统(尤其是手机)中,控制耗电量很重要,直接影响到电池的续航时间。所以,如果系统中某一个模块暂时不需要使用,就可以通过Regulator关闭其电源…

网络基础三——其他周边问题

3.1ARP原理 ​ ARP不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议; ​ 以广播的形式(主机号填成全1)构建Mac帧,发送ARP请求包,告诉所有在局域网的主机我的IP地址和Mac帧,与目的IP相同的主…

意得辑意得辑

你是否也曾遇到过在发表论文时英语写作水平不尽如人意的困境?审稿意见总是指出语言表达不够好,需要找英语母语者修改?不用担心,我和你一样,也曾历经这样的挑战。但是,我找到了一家值得信赖的专业润色机构—…

深入分析Linux上下文与上下文切换

Linux 进程运行空间与特权等级 在 Linux 操作系统中,进程的运行空间被划分为内核空间和用户空间,这种划分是为了保护系统的稳定性和安全性。这两个空间对应着 CPU 的特权等级,分别为: Ring 0(内核态)Ring…

全国青少年劳动技能与智能设计大赛安徽省赛区赛前培训在肥东六中顺利举办

为推进我省青少年劳动教育和素质教育高质量发展,提升青少年家国情怀、多元思维、劳动技能、创新能力和综合素质,发现和培养创新后备人才。4月10日,肥东县教体局联合安徽省青少年劳动技能与智能设计大赛组委会在肥东六中创新科教基地成功举行全…

人工智能分类算法概述

文章目录 人工智能主要分类算法决策树随机森林逻辑回归K-均值 总结 人工智能主要分类算法 人工智能分类算法是用于将数据划分为不同类别的算法。这些算法通过学习数据的特征和模式,将输入数据映射到相应的类别。分类算法在人工智能中具有广泛的应用,如图…

目标检测——车牌图像数据集

一、重要性及意义 车牌图像识别的重要性及意义主要体现在以下几个方面: 智能交通管理:车牌图像识别技术是智能交通系统(ITS)的核心组成部分。通过自动识别车辆车牌,可以实现对交通违章行为的自动记录和处理&#xff…

SSD涨价停不下来!

随着HBM内存产能短缺问题的出现,存储市场正遭遇另一波供应短缺。在2021年存储市场陷入低迷后,SSD价格已连续下滑约两年。面对市场变化,存储厂商减少了NAND闪存的生产。随着减产策略的有效执行,需求部分回升,导致SSD供应…

jni 开发 调用dll 函数的流程

jni 调用dll方法以及dll内调用java方法的流程 编写java类 public class abc{static{System.loadLibrary("abc.dll");}public String getResponse(String ReqStr) {return "ok";}public native void InitDiagObj();public native void CarryabcEntry(Stri…

C++的并发世界(十一)——线程池

0.线程池的概念 1.线程池使用步骤 ①初始化线程池:确定线程数量,并做好互斥访问; ②启动所有线程 ③准备好任务处理基类; ④获取任务接口:通过条件变量阻塞等待任务 2.atomic原子操作 std:atomic是C11标准库中的一个…