Redis的String类型为什么重新设计使用了SDS数据结构呢

news2024/10/6 6:47:18

Redis 选择重新设计其 String 类型的底层数据结构,采用 SDS(Simple Dynamic String)而不是直接使用 C 语言标准库提供的原生字符串(char*)的原因主要包括以下几点:

  1. O(1) 时间复杂度获取长度

    • 在 C 语言中,获取一个以空字符 \0 结尾的字符串长度需要遍历整个字符串直到找到结束符,时间复杂度为 O(N)。
    • SDS 在结构体头部显式记录了字符串的长度 len,因此可以直接通过读取这个字段得知字符串长度,无需遍历,时间复杂度降为 O(1)。
  2. 空间预分配与惰性释放

    • SDS 在执行修改字符串操作时,会对内存进行预分配策略,预留一定的未使用空间 free,这样当后续有连续的追加操作时,避免了频繁的内存重分配。
    • 同时,当字符串缩短时,SDS 不会立即回收内存,而是保持已分配内存,仅减少 len 的值,这样可以更快地执行字符串缩短操作,并在未来可能的扩展操作中重复利用这部分空间。
  3. 二进制安全

    • C 语言的字符串必须以空字符结束,不支持包含内部 \0 字符的二进制数据。
    • SDS 支持任意二进制数据存储,因为它不是基于空字符来判断字符串的结束,而是根据长度字段来确定字符串内容。
  4. 防止缓冲区溢出

    • 直接操作 C 字符串容易出现缓冲区溢出的问题,尤其是在拼接和修改字符串时,如果没有正确处理可能会导致安全问题。
    • SDS 在执行修改操作时会检查现有空间是否足够,如果不够则会自动进行扩展,确保不会发生溢出。

综上所述,SDS 设计旨在提高 Redis 的性能、安全性及对不同场景的适应能力,尤其对于高并发环境下频繁进行字符串操作的服务端数据库系统来说,这些优化显得尤为重要。

 

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

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

相关文章

SpringBoot健康监控

文章目录 1-SpringBoot2-监控-健康监控服务2-SpringBoot2-监控-Admin可视化 在Spring Boot中,可以通过Actuator模块实现应用程序的健康监控。Actuator是Spring Boot提供的一个用于监控和管理应用程序的模块,可以轻松地查看应用程序的运行状况、性能指标和…

部署prometheus 监控k8s集群

目录 1、主机清单 2、拉取镜像 3、服务安装 4、安装prometheus-operator 5、查看custom metrics api 6、获取prometheus端口 7、将 alertmanager-main 、grafana、prometheus-k8s的端口暴露出来 8、再次查看prometheus端口 9、浏览器访问IP:31940 部署k8集群…

创建vue3项目并集成cesium插件运行

创建vue3项目并集成cesium插件 一、vue项目创建 1、前期准备 node.js&npm或yarn 本地开发环境已经安装好。 参考安装 2、安装vue-cli,要求3以上版本 #先查看是否已经安装 vue -V#安装 npm install -g vue/cli4.5.17 示例:Idea工具 页面 Termin…

【物联网开源平台】tingsboard二次开发环境搭建+编译

文章目录 一,需要准备的环境二,获取tingsboard源码1.git拉取源码2.下载源码压缩包 三.新建仓库存放依赖文件四,编译五,遇到的错误 提示: 1.这篇只要准备两个环境,方法更简单! 2.基于tingsboard …

CSS3新属性(学习笔记)

一、. 圆角 border-radius:; 可以取1-4个值&#xff08;规则同margin&#xff09; 可以取px和% 一般用像素&#xff0c;画圆的时候用百分比&#xff1a;border-radius:50%; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…

Linux环境下使用Eclipse Paho C 实现(MQTT Client)同步模式发布和订阅Message

目录 概述 1 同步模式和异步模式 1.1 同步模式 1.2 异步模式 2 下载和安装paho.mqtt.c 3 同步方式发布和订阅消息功能实现 3.1 MQTT Client参数配置 3.2 初始化MQTT Client 3.3 发布消息功能 3.4 订阅消息功能 3.5 解析订阅的信息 4 编译和测试 4.1 编译代码 4.2…

InstructGPT的流程介绍

1. Step1&#xff1a;SFT&#xff0c;Supervised Fine-Tuning&#xff0c;有监督微调。顾名思义&#xff0c;它是在有监督&#xff08;有标注&#xff09;数据上微调训练得到的。这里的监督数据其实就是输入Prompt&#xff0c;输出相应的回复&#xff0c;只不过这里的回复是人工…

ctfshow-web入门-反序列化

web254 先看题 <?php/* # -*- coding: utf-8 -*- # Author: h1xa # Date: 2020-12-02 17:44:47 # Last Modified by: h1xa # Last Modified time: 2020-12-02 19:29:02 # email: h1xactfer.com # link: https://ctfer.com*/error_reporting(0); highlight_file(__FIL…

详细解读开源版Sora视频生成模型

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;OpenAI的视频生成模型Sora一经发布就广受全世界的瞩目&#xff0c;上海人工智能实验室最近推出了一个基于Diffusion Transformer的结构的模型Latte&#xff0c;堪称最接近Sora原理的视频生成模型。这篇博客…

神级工具之git (一): git 基操

一切都从&#xff1a;Git User Manual开始&#xff0c;或者中文版的Git中文手册 核心概念 工作区 工作区我们可见的&#xff0c;可以进行修改的目录树。我们可以在目录树中进行文件的查看&#xff0c;修改。通常我们会使用一个神级编辑器Vim。我给她取了个名字&#xff0c;就…

综合知识篇19-软件知识产权保护考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

【AI】发现一款运行成本较低的SelfHosting语言模型

【背景】 作为一个想构建局域网AI服务的屌丝,一直苦恼的自然是有限的资源下有没有对Spec要求低一点的SelfHosting的AI服务框架了。今天给大家介绍这款听起来有点希望,但是我也还没试验过,感兴趣的可以去尝试看看。 【介绍】 大模型生成式AI与别的技术不同,由于资源要求高…

CSK6 接入聆思平台(LSPlatform)

一、开发环境 硬件&#xff1a;视觉语音大模型AI开发套件 二、使用大语言模型 官方指导文档&#xff1a; 开始使用 | 聆思文档中心 获取API密钥 | 聆思文档中心 1、注册 提交申请之后需要将注册电话号码通过微信发送给聆思科技工作人员&#xff0c;工作人员授权后&#xff…

使用 chezmoi vscode, 管理你的 dotfiles

什么是 dotfiles In Unix-like operating systems, any file or folder that starts with a dot character (for example, /home/user/.config), commonly called a dot file or dotfile. 任何以 . 开头去命名的文件或者目录都可以称为 dotfile, 在 Unix-like 系统一般用的比较…

JavaEE-文件操作和IO

我们先来认识狭义上的⽂件(file)。针对硬盘这种持久化存储的I/O设备&#xff0c;当我们想要进⾏数据保存时&#xff0c;往往不是保存成⼀个整体&#xff0c;⽽是独⽴成⼀个个的单位进⾏保存&#xff0c;这个独⽴的单位就被抽象成⽂件的概念&#xff0c;就类似办公桌上的⼀份份真…

工作中常用到的Linux命令

系统&#xff0c;用户信息操作相关命令 查看主机ip地址 ifconfig 获取用户信息 id 修改用户密码 passwd 查看链接用户 who 创建新用户账号 useradd 删除用户账号 userdel 修改用户账号的属性 usermod 查看系统发行版本 cat /proc/version 说明适用于所有版本。…

C++面向对象三大特征-----继承(详细版)

目录 继承 一、继承的基础介绍 普通版网页和继承版网页的区别 语法 二、继承方式 三种继承方式 三、继承中的对象模型 四、继承中构造和析构函数 五、继承同名成员的处理方式 访问同名成员&#xff1a; 作用域写法&#xff1a; 六、继承同名静态成员的处理方式 访问…

通讯录的模拟实现(C语言)

通讯录要求&#xff1a; 1&#xff0c;联系人要拥有姓名。年龄。性别&#xff0c;电话&#xff0c;地址 2&#xff0c;拥有增加&#xff0c;删除&#xff0c;搜索&#xff0c;修改&#xff0c;展示&#xff08;所有联系人&#xff09;&#xff0c;退出功能 3&#xff0c;能存…

力扣49. 字母异位词分组

Problem: 49. 字母异位词分组 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.以字符串作为键&#xff0c;与该键是字母异位词所组成的数组为值创建map集合&#xff1b; 2.每次取出一个字符串将其排序&#xff0c;再存入对应的数组&#xff1b; 3.将map中的值存…

VSGitHub项目联动(上传和克隆),创建你的第一个仓库,小白配置

目录&#xff1a; 前言一&#xff0c;基本说明1.1名词概念1.2必配条件 二&#xff0c;配置方法2.1本地生成密钥2.2云端代码托管平台SSH配置添加&#xff08;GitHub&#xff09;2.3VS项目配置 三&#xff0c;参考四&#xff0c;一些讨论 前言 &#x1f308;在编写VS代码项目时&a…