Redis的SDS數據結構解決C語言字符串缺陷

redis設計了SDS這一數據結構來表示字符串而不是使用c語言的字符串:字符數組

那么redis為什么要大費周章自己設計字符串呢?

答案是C語言字符串有缺陷

1.獲取字符串長度,需要遍歷字符數組,時間復雜度是O(N)

2.字符串結尾以"\0"表示,因此字符串內容本身不能包含"\0",因此不能保存二進制數據

3.字符串操作函數不安全,可能會造成緩沖區溢出(這個你一定知道)

我們一一詳細介紹這些c語言字符串的缺陷

1.獲取字符串長度性能低

由于c語言字符串就是一個以’\0’結尾的字符數組,當你需要一個字符串的長度時,你可能會調用strlen函數,那么這個函數是如何獲取字符串的長度的呢?

在這里插入圖片描述

strlen會遍歷整個字符數組,一直遇到’\0’結束

這個操作的時間復雜度是O(N),對于redis來說代價太大了

redis是怎么解決獲取字符串長度的問題的?

在這里插入圖片描述

可以看到,對于redis的字符串SDS,不單有保存字符串的數組空間,還有一些額外的成員

len,記錄字符串長度,使得獲取字符串長度的時間復雜度降到O(1)

2.緩沖區溢出

舉個例?,strcat 函數是可以將兩個字符串拼接在?起。

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

Q:redis是如何解決的?

A:SDS的alloc成員,分配給字符數組的空間?度。這樣在修改字符串的時候,可以通過 alloc - len 計算出剩余的 空間??,可以?來判斷空間是否滿?修改需求,如果不滿?的話,就會?動將 SDS 的空間擴展? 執?修改所需的??,然后才執?實際的修改操作,所以使? SDS 既不需要?動修改 SDS 的空間? ?,也不會出現前?所說的緩沖區溢出的問題

3.不能保存二進制數據

這個很好理解,由于’\0’代表字符串結尾,會造成讀入終止,這個限制使得 C 語?的字符串只能保存?本數據,不能保存像圖?、?頻、視頻?化這 樣的?進制數據

推薦學習 https://xxetb.xetslk.com/s/p5Ibb

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

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

相關文章

Springboot vue3 elementplus 景點評論數據分析與可視化系統源碼

源碼鏈接 系統演示:鏈接:https://pan.baidu.com/s/1J056R4rYji_mc4gwteZEzg?pwdnua4

關于Linux系統用戶和用戶組的使用

天行健,君子以自強不息;地勢坤,君子以厚德載物。 每個人都有惰性,但不斷學習是好好生活的根本,共勉! 文章均為學習整理筆記,分享記錄為主,如有錯誤請指正,共同學習進步。…

教程 | 在 Navicat 17 中管理連接

Navicat 17 提供了比以往更多的連接數據庫實例的方式。除了傳統的連接字符串方式以外,Navicat 17 還支持 URI 連接,無論身在何處,都可以輕松地通過 URI 訪問對象。另外,還有一個新的管理連接功能,即允許你通過一個以用…

【LeetCode】39.組合總和

組合總和 題目描述: 給你一個 無重復元素 的整數數組 candidates 和一個目標整數 target ,找出 candidates 中可以使數字和為目標數 target 的 所有 不同組合 ,并以列表形式返回。你可以按 任意順序 返回這些組合。 candidates 中的 同一個…

高中數學:平面向量-常考題型匯總

一、數量積運算 例題1 解析 首先,為了化簡運算過程,我們把OA、OB、OC向量記作a、b、c向量。 其次,充分利用已知條件,進行消元,兩邊平方,可以消除一個向量。 a → \mathop{a}\limits ^{\rightarrow} a→ *…

【簡單探索微軟Edge】

🎥博主:程序員不想YY啊 💫CSDN優質創作者,CSDN實力新星,CSDN博客專家 🤗點贊🎈收藏?再看💫養成習慣 ?希望本文對您有所裨益,如有不足之處,歡迎在評論區提出…

(delphi11最新學習資料) Object Pascal 學習筆記---第14章泛型第2節(Object Pascal中的泛型)

14.2 Object Pascal中的泛型 ? 在前面的例子中,我們已經看到了如何在Object Pascal中定義和使用泛型類。我決定在深入討論這個非常重要但又相當復雜的技術細節之前,通過一個例子來介紹泛型這一特性。在從語言角度討論泛型之后,我們將列舉更…

Hadoop文件存儲格式

1. TextFile 默認格式,存儲方式為行存儲,數據不做壓縮,磁盤開銷大,數據解析開銷大。可結合 Gzip、Bzip2 使用(系統自動檢查,執行查詢時自動解壓),但使用 這種方式,壓縮后的文件不支持 split&am…

2024.6.3總結1100

今天面試了一家廣西電信公司,然后受到武漢華為的hr的電話溝通,如果沒意外的話,下周就能收到offer了。 求職也算是踏入社會的第一步了,經過兩個月的求職過程,我除了關于求職方面的技巧,也擴展了我的認知。 …

R語言安裝caret包報錯

R語言安裝caret包報錯:Error: package or namespace load failed for ‘caret’ in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck vI[[i]]): 不存在叫‘recipes’這個名字的程輯包 https://rbasics.org/packages/caret-package-in-r/ R版本的問題&…

商業新聞|你還在用傳統搜索引擎嗎?

??今天是2024年第22周 這是Yura「輸出倒逼輸入」計劃的第11篇文章 全年進度:11/52 01 AI搜索為什么沒超過傳統搜索? 生成式AI在搜索引擎領域掀起了一輪又一輪的波瀾,但是一年多過去了,不管是必應還是perplexity都并沒有動搖Goog…

深度解讀GPT基本原理

GPT(Generative Pre-trained Transformer)是一種基于Transformer架構的生成式預訓練模型,其核心在于通過大規模無監督學習來捕捉語言知識和模式,并通過微調來適應各種下游任務。以下是GPT基本原理的詳細解讀: 1.Trans…

pandas習題 036:選擇 DataFrame 的多個列

有以下一個 DataFrame,請從中選擇 name 和 english 這兩列形成一個 DataFrame。 import pandas as pddata {name: [Alice, Bob, Charlie, David, Eve],grade: [10, 11, 10, 12, 11],math: [90, 85, 92, 88, 95],english: [85, 92, 88, 90, 92],science: [92, 90, …

【TB作品】MSP430G2553霓虹燈呼吸燈跑馬燈

霓虹燈: 跑馬燈: 呼吸燈: 所有代碼: 下載: https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tabBB08J2

蘋果CMS:怎么添加2019和2020年份篩選

我們進入搜索的時候看到一個關于年份的搜索,那如果上面沒有出現19,20我們該如何處理呢? 我們進入管理后臺 -【系統】-【網站參數配置】-【預留參數】 添加下視頻年代逗號隔開即可 如果要設置地區,語言也實在這里直接配置即可!&am…

毫米波雷達陣列天線設計綜合1(MATLAB仿真)

1 天線設計目標 毫米波雷達探測目標的距離、速度和角度,其中距離和角度和天線設計相關性較強。天線增益越高,則根據雷達方程可知探測距離越遠;天線波束越窄,則角度分辨率越高;天線副瓣/旁瓣越低,則干擾越少…

Kibana的使用

在學習elasticsearch時,可以使用Kibana自帶的開發工具,來提高效率, 瀏覽器打開Kibana,在左側菜單欄中找到Dev Tools 該工具提供代碼提示和代碼格式化功能,非常有用,

C++筆記(1)

1. C語言和C的區別? C語言作為一種過程性語言,側重于通過算法描述來指導計算機執行,將復雜程序分解為簡單、可管理的模塊。 C語言支持模塊化編程,每個模塊作為獨立的單元。C融合了3中不同的編程方式:C語言、面向對象…

【已解決】記錄Vue2.x中npm install下載依賴報錯:python2 Error: not found: python2問題(具體操作步驟)

項目場景: 項目場景:在項目開發中,升級了本地node版本后,重新npm install下載依賴報錯找不到python環境 not found: python2 npm ERR! gyp verb check python checking for Python executable “python2” in the PATH 在嘗試了各…

Codeforces Round 950 (Div. 3)(A~F2)

G題只會暴力..不會數據結構 A - 問題 Generator 暴力模擬即可 // Problem: A. Problem Generator // Contest: Codeforces - Codeforces Round 950 (Div. 3) // URL: https://codeforces.com/contest/1980/problem/A // Memory Limit: 256 MB // Time Limit: 1000 ms // //…