Redis---字符串SDS(簡單動態字符串)底層結構

文章目錄

  • 什么是SDS(簡單動態字符串)
  • SDS結構
  • SDS的優點
    • O(1) 時間復雜度獲取字符串長度
    • 避免緩沖區溢出
    • 減少內存重分配次數
    • 二進制安全
    • 兼容C語言字符串函數
  • SDS的操作
  • 總結


什么是SDS(簡單動態字符串)

redis是由C語言編寫的,但是redis在實現字符串中并沒有采用傳統C語言中的字符串表示(傳統的C語言字符串是一個以空字符‘\0’結尾的字符數組char*),而是自己定義了一種叫做簡單動態字符串(simple dynamic string, 簡稱SDS)的抽象類型,并用SDS用作redis默認的字符串表示。

SDS結構

Redis 5.0 及之后的版本

struct __attribute__ ((__packed__)) sdshdr {uint8_t len;        // 字符串的實際長度uint8_t alloc;      // 分配的總空間(不包括頭部和結尾的 \0)unsigned char flags; // 標志位,用于標識 SDS 的類型char buf[];         // 存儲字符串內容的柔性數組
};
  • len:記錄字符串的實際長度(不包括結尾的 \0)。

  • alloc:記錄分配的總空間(不包括頭部和結尾的 \0)。

  • flags:標志位,用于標識 SDS 的類型(如 SDS_TYPE_8SDS_TYPE_16 等)。

  • buf:存儲字符串內容的動態數組,末尾會自動添加 \0,以兼容 C 語言的字符串函數。

新版SDS根據字符串的長度動態選擇不同的類型:

  • SDS_TYPE_5:長度小于 32。

  • SDS_TYPE_8:長度小于 256。

  • SDS_TYPE_16:長度小于 65536。

  • SDS_TYPE_32:長度小于 2^32。

  • SDS_TYPE_64:長度小于 2^64。

這種設計可以根據字符串的實際長度動態調整頭部的大小,進一步節省內存。

SDS的優點

O(1) 時間復雜度獲取字符串長度

C 語言的原生字符串需要通過遍歷(strlen)來獲取長度,時間復雜度為 O(n)。

SDS 直接通過 len 字段獲取長度,時間復雜度為 O(1)。

避免緩沖區溢出

C 語言的原生字符串操作(如 strcat)容易導致緩沖區溢出。

// 將 src 字符串拼接到 dest 字符串后面
char *strcat(char *dest, const char* src);

C 語言的字符串是不會記錄自身緩沖區大小的,所以 strcat 函數假定程序員在執行這個函數時,已經為 dest 分配了足夠多的內存,可以容納 src 字符串中的所有內容,而一旦這個假定不成立,就會發生緩沖區溢出可能會造成程序運行終止

SDS 在修改字符串時會檢查剩余空間(free),如果不足則自動擴展,避免溢出。

減少內存重分配次數

SDS 采用預分配空間的策略:

  • 當字符串長度增加時,SDS 會額外分配一些未使用的空間(free),減少后續修改時的內存重分配次數。
  • 例如,SDS 的擴容策略通常是:新長度小于 1MB 時,分配雙倍空間;大于 1MB 時,額外分配 1MB。

二進制安全

C 語言的原生字符串以 \0 作為結束符,不能存儲包含 \0 的二進制數據。因此其只能保存文本數據,不能保存圖片,音頻,視頻和壓縮文件等二進制數據,否則可能出現字符串不完整的問題,所以其是二進制不安全。

SDS 通過 len 字段記錄長度,可以存儲任意二進制數據,包括 \0

兼容C語言字符串函數

SDSbuf 字段末尾會自動添加 \0,因此可以直接使用 C 語言的字符串函數(如 printf)。

SDS的操作

Redis 提供了一系列函數來操作 SDS,例如:

  • 創建 SDSsdsnewsdsempty
  • 追加字符串sdscat
  • 復制字符串sdscpy
  • 釋放 SDSsdsfree
  • 獲取長度sdslen
  • 獲取剩余空間sdsavail

總結

SDS 是 Redis 中用于表示字符串的底層數據結構,具有高效、安全、靈活的特點。它通過預分配空間、記錄長度等方式,避免了 C 語言原生字符串的缺陷,同時兼容 C 語言的字符串函數。SDS 的設計是 Redis 高性能和高可靠性的重要基礎之一。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70865.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70865.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70865.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Elasticsearch:使用阿里云 AI 服務進行嵌入和重新排名

作者:來自 Elastic Toms Mura 將阿里云 AI 服務功能與 Elastic 結合使用。 更多閱讀,請參閱 “Elasticsearch:使用阿里 infererence API 及 semantic text 進行向量搜索”。 在本文中,我們將介紹如何將阿里云 AI 功能與 Elastics…

Spring Cloud Alibaba與Spring Boot、Spring Cloud版本對應關系

一、前言 在搭建SpringCloud項目環境架構的時候,需要選擇SpringBoot和SpringCloud進行兼容的版本號,因此對于選擇SpringBoot版本與SpringCloud版本的對應關系很重要,如果版本關系不對應,常見的會遇見項目啟動不起來,怪…

【含文檔+PPT+源碼】基于過濾協同算法的旅游推薦管理系統設計與實現

項目介紹 本課程演示的是一款基于過濾協同算法的旅游推薦管理系統設計與實現,主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含:項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本套…

MTK Android12 預裝apk可卸載

文章目錄 需求解決方法1、device/mediatek/mt6761/device.mk2、/vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_vendor_list.txt3、路徑:4、Android.mk 需求 近期,客戶需要預裝一個apk,同時該apk要可卸載。解…

從 0 到 1,用 Python 構建超實用 Web 實時聊天應用

從 0 到 1,用 Python 構建超實用 Web 實時聊天應用 本文深入剖析如何運用 Python 的 Flask 框架與 SocketIO 擴展,搭建一個功能完備的 Web 實時聊天應用。從環境搭建、前后端代碼實現,到最終運行展示,逐步拆解關鍵步驟&#xff0…

視頻字幕識別和翻譯

下載的視頻很多不是漢語的,我們需要用剪映將語音識別出來作為字幕壓制到視頻中去。 剪映6.0以后語音識別需要收費,但是低版本還是沒有問題。 如果想要非漢語字幕轉成中文,剪映低版本不提供這樣功能。但是,用剪映導出識別字幕&am…

每天一個Flutter開發小項目 (4) : 構建收藏地點應用 - 深入Flutter狀態管理

引言 歡迎回到 每天一個Flutter開發小項目 系列博客!在前三篇博客中,我們從零開始構建了計數器應用、待辦事項列表應用,以及簡易天氣應用。您不僅掌握了 Flutter 的基礎組件和布局,還學習了網絡請求、JSON 解析等實用技能,更重要的是,我們一起探討了高效的 Flutter 學習…

Visual Studio打開文件后,中文變亂碼的解決方案

文件加載 使用Unicode(UTF-8)編碼加載文件 C:\WorkSpace\Assets\Scripts\UI\View\ExecuteComplateView.cs時,有些字節已用Unicode替換字符替換。保存該文件將不會保留原始文件內容。

OpenGL ES -> GLSurfaceView繪制點、線、三角形、正方形、圓(頂點法繪制)

XML文件 <?xml version"1.0" encoding"utf-8"?> <com.example.myapplication.MyGLSurfaceViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"…

threejs 安裝教程

嗨&#xff0c;我是小路。今天主要和大家分享的主題是“threejs 安裝教程”。 在當今的數字化時代&#xff0c;用戶對視覺體驗的要求越來越高。傳統的2D網頁已經無法滿足所有需求&#xff0c;而三維&#xff08;3D&#xff09;圖形技術則為前端開發者提供了新的方向。…

win11編譯pytorch cuda128版本流程

Geforce 50xx系顯卡最低支持cuda128&#xff0c;torch cu128 release版本目前還沒有釋放&#xff0c;所以自己基于2.6.0源碼自己編譯wheel包。 1. 前置條件 1. 使用visual studio installer 安裝visual studio 2022&#xff0c;工作負荷選擇【使用c的桌面開發】,安裝完成后將…

如何安裝Vm和centos

一、VMware 安裝 &#xff08;一&#xff09;前期準備 下載 VMware 軟件&#xff1a;首先&#xff0c;你需要從 VMware 官方網站下載適合你計算機操作系統版本的 VMware Workstation 軟件安裝包。確保選擇的版本與你的主機操作系統兼容&#xff0c;例如&#xff0c;如果你的主…

OpenGL 04--GLSL、數據類型、Uniform、著色器類

一、著色器 在 OpenGL 中&#xff0c;著色器&#xff08;Shader&#xff09;是運行在 GPU 上的程序&#xff0c;用于處理圖形渲染管線中的不同階段。 這些小程序為圖形渲染管線的某個特定部分而運行。從基本意義上來說&#xff0c;著色器只是一種把輸入轉化為輸出的程序。著色器…

服務器離線部署DeepSeek

目標 本次部署的目標是在本地服務器上部署DeepSeek。但是該服務不能連接外網&#xff0c;因此只能使用離線部署的方式。為了一次完成部署。現在云服務器上進行嘗試。 云服務器部署嘗試 云服務器配置 CentOS72080Ti 11GB 安裝準備 1、上傳iso并配置為本地yum源 安裝前先將…

刪除idea recent projects 記錄

1、退出idea&#xff08;一定要全部退出idea&#xff0c;要不然刪除后&#xff0c;idea一退出&#xff0c;又保存上了&#xff09; 2、進入 C:\Users\Administrator\AppData\Roaming\JetBrains\IntelliJIdea2024.1\options 目錄 根據不同的版本號 IntelliJIdea2024.1 這個地方…

【MySql】EXPLAIN執行計劃全解析:15個字段深度解讀與調優指南

文章目錄 一、執行計劃核心字段總覽二、關鍵字段深度拆解1. type&#xff08;訪問類型&#xff09;——查詢性能的晴雨表典型場景分析&#xff1a; 2. key_len&#xff08;索引使用長度&#xff09;——索引利用率的檢測儀計算示例&#xff1a; 3. Extra&#xff08;附加信息&a…

如何實現一個 Spring Boot Starter

在 Spring Boot 中&#xff0c;Starter 是一種自動配置的模塊&#xff0c;它封裝了一些常用的功能&#xff0c;并通過 Spring Boot 的約定大于配置的原則&#xff0c;使開發者能夠快速使用和集成相關功能。通常&#xff0c;Spring Boot Starter 包含了所需的依賴、配置、自動化…

使用python做http代理請求

有這樣一個需求現在有兩臺A&#xff0c;B兩臺電腦組成了一個局域網&#xff0c;在A電腦上開發webjava應用&#xff0c;需要調用第三方接口做http請求&#xff0c;但是這個請求只能在B電腦上請求。 一種解決方案&#xff1a;自定義一個中間服務&#xff0c;在電腦B上運行一個簡…

系統架構設計師考點——嵌入式技術

一、備考指南 嵌入式技術主要考查的是嵌入式基礎知識、嵌入式設計等相關知識&#xff0c;在系統架構設計師的考試中選擇題占2~4分&#xff0c;案例分析有時會考關鍵路徑的技術問答&#xff0c;這個題目一般比較難&#xff0c;但是由于案例分析題是五題選三題&#xff0c;所以…

當AI重構認知:技術狂潮下的教育沉思錄

備注&#xff1a;文章未Deepseek R1模型輔助生成&#xff0c;如有不妥請諒解。 以下使原文&#xff1a; 我有三個娃&#xff0c;各間隔4到5歲&#xff0c;經歷過搜索引擎&#xff0c;短視頻&#xff0c;短劇&#xff0c;本身曾經也是教育專業出生&#xff0c;任何事務都有兩面性…