redis 基本數據類型-字元串(String)

来源:https://www.cnblogs.com/art-geek/archive/2018/12/19/10140956.html
-Advertisement-
Play Games

不瘦原來對redis也是有個大概的瞭解(就你知道的多), 但是最近和大神聊天的過程中才明白自己知道的簡直就是雞毛蒜皮(讓你得瑟),所以不瘦打算從頭在捋一遍,順便把過程也記錄下來,如果能給大家在學習redis的道路上提供一條清晰的線索,不瘦胖也瞑目了. 我們知道redis沒有直接使用C語言中的字元串, ...


不瘦原來對redis也是有個大概的瞭解(就你知道的多), 但是最近和大神聊天的過程中才明白自己知道的簡直就是雞毛蒜皮(讓你得瑟),所以不瘦打算從頭在捋一遍,順便把過程也記錄下來,如果能給大家在學習redis的道路上提供一條清晰的線索,不瘦胖也瞑目了.

 

我們知道redis沒有直接使用C語言中的字元串,而是定義了簡單動態字元串(simple dynamic string,SDS)的抽象類型, 並將 SDS 用作 Redis 的預設字元串表示。其中SDS數據結構如下:

struct sdshdr {
    int len;     // len表示buf中存儲的字元串的長度
    int free;    // free表示buf中空閑空間的長度
    char buf[];  // buf用於存儲字元串內容
};

可以看到,就是將一個字元數組和兩個整型變數封裝在結構體中,但是這一封裝加上一些看似簡單的方法(大道至簡)就為SDS增加了很多特性:

  • 二進位安全

      和C語言字元串只能某種編碼(如ASCII),並且出結尾不能有'\0'字元相比,SDS也可以存儲像圖片,音頻,視頻這樣的二進位數據

  • 字元串長度計算,時間複雜度為O(1)

      因為在SDS結構體中存儲了len,計算長度時直接返回即可(以空間換時間),而C語言要計算字元串長度時間複雜度為O(n)

  • 杜絕緩衝區溢出

      我們知道在C語言拼接字元串時,如果超出原字元串申請的記憶體大小就會導致緩衝區溢出,而SDS的空間分配策略直接避免了溢出的可能性:當對SDS修改時,會先檢查剩餘空間是否         滿足(free變數的作用),如果不滿足,則進行自動擴容.

  • 減少修改帶來記憶體分配次數

      redis作為資料庫經常被用於速度要求嚴苛、數據被頻繁修改的場合,  如果每次修改長度都需要執行一次記憶體重分配的話, 那麼光是執行記憶體重分配的時間就會占去修改所用時間的       一大部分, 如果這種修改頻繁地發生的話, 可能還會對性能造成影響。

      為了應對這種應用場景,redis採取了兩種策略: 增加長度時空間預分配(每次多申請點),減少長度時空間惰性釋放(只改free的大小,不實際釋放空間)

 

註意事項:

  • SDS作為key時長度不能超過512MB

     

參考:

《Redis設計與實現》 

 

這裡是老瘦家的兒子,如需轉載請聲明,我替老瘦感謝你。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • yum upgrade:更新系統包到最新版本,有事可以解決未知的問題 init 3:進入編碼界面 init 5 || startx:進入圖形界面 安裝文件的時候會出現 is this ok [y/d/n] 這個東西 安裝的話輸入y 然後回車 y = yesn = nod = download onl ...
  • ELk(Elasticsearch, Logstash, Kibana)的安裝配置 本文中所有的版本都是基於5.2.0,因為公司es(Elasticsearch)的環境是5.2.0。 1. Elasticsearch的安裝 "官網" 關於Elasticsearch的安裝在之前的文章中已經寫過了,這裡 ...
  • 1.日誌介紹 2.日誌清理 (以下達到清理效果) 3.編寫sh文件(> 重定向) 在root目錄下新建sh文件 vim /root/clean_log.sh 重啟使任務生效 ...
  • 0 */6 * * * /home/kdb/php/bin/php /home/kdb/apache/htdocs/lklkdbplatform/kdb_release/Crontab/index.php /TakeOut/update_token release 10.18.25.30 //每隔6 ...
  • 1.基本命令行模式 註意:非root用戶 systemctl restart crond 失效,請使用最底層的驅動重啟 2.crontab日誌 cron日誌保存在系統目錄/var/log/cron 命令:tail -n 2 /var/log/cron 註意:預設root許可權才可以 ...
  • 前言: 環境:centos7.5 64 位 正文: Docker 軟體包已經包括在預設的 CentOS Extras 軟體源里。因此想要安裝 docker,只需要運行下麵的 yum 命令: 啟動 docker 加速訪問 Docker Hub 搞定 ...
  • 由於公司停電,導致幾十臺vmWare虛擬機器啟動報錯。 錯誤:Failed to power on virtual machine XXX. Failed to lock the file Click here for more details. 有些場景也會出現下麵的錯誤:Failed to po ...
  • 這邊記錄一下如何在windows與linux之間進行文件的傳輸,下麵是具體的網址。 原文地址::http://blog.csdn.net/shufac/article/details/51966276 相關文章 1、Xshell實現Windows上傳文件到Linux主機 http://www.lin ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...