Redis設計與實現-數據結構(建設進度17%)

Redis數據結構

    • 引言
    • 數據結構
      • string
        • SDS數據結構
        • 原生string的不足
      • hash

本博客基于《Redis設計與實現》進行整理和補充,該書依賴于Redis 3.0版本,但是Redis6.0版本在一些底層實現上仍然沒有明顯的變動,因此本文將在該書的基礎上,對于后面進行變更的一些技術項進行額外說明,當然我相信大家學習Redis,可能更多的是進行面試,本博客的一個功利目的,也是希望讀完本書之后對于市面上常見的redis面試題能做到心中有數,直接秒殺。

引言

Redis是什么,大家可能會不假思索的說出 是個緩存中間件,但是如果只是緩存的話,我們為什么不能直接使用本地緩存,或者mongo這樣的nosql呢,那么這里呢,我們就要從一個更高更抽象的角度去理解Redis,Redis并不是在開發過程中必須存在的中間件,甚至在最開始單機開發的場景,我們可以完全不用Redis,我們從Redis這幾個字母上來理解一下Redis的含義,Re- Remote Di- dictionary S-server 遠程字典服務,也就是他其實就是一個遠程的本地字典存儲。
本地緩存的缺點是很明顯的,如果我們不使用比如guava或者caffine這樣的本地緩存管理包, 那么在本地僅僅是管理緩存就是一件很困難的事情,更何況 本地緩存也更加不適合分布式的開發環境,重啟服務緩存消失這樣的問題。而mongo將數據存儲在磁盤上,從而導致,讀寫速度可能會成為mongo的瓶頸。正是因為有著這樣的問題,因此我們才單獨將一些需要進行告訴讀取寫入存儲一些字典的功能交給了一個更合適的遠程服務 即是 Redis

而在使用上,我們甚至可以直接理解為Redis就是一個遠程的Hash,我們能像使用本地緩存那樣使用Redis,而不需要單獨考慮數據會不會丟失,數據一致性問題等等。

當然我們現在還是要看一個更加學術并且權威的介紹,這里我直接給到Redis最新的intro:

Redis is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams

Redis是一款擁有BSD授權的開源軟件,可以存儲一些內存數據結構數據,你可以把它用作數據庫緩存,消息中間存儲,流引擎。 Redis支持的數據結構有字符串,hash,列表,集合,帶范圍的有序列表,位圖,hyperloglogs,gis存儲和流。

好,那么經過上面的簡單介紹,我們接下來將繼續更加深入的學習Redis的數據結構。

數據結構

redis所有的存儲類型都是一個的鍵值對類型,其中key的類型肯定是一個字符串,而value的存儲對象則有 string,hash,set等類型,下面我們會對這些類型的底層實現進行更詳細的探討。

string

redis是使用c語言編寫的,在c語言中,并沒有string這個內置類型,而是使用char[]來代替string,但是很顯然[]char類型有很多問題,所以redis采用SDS來實現字符串。

SDS數據結構

在開始之前我們有必要首先了解一下SDS的數據結構

struct sdshdr {int len; //記錄使用長度int free; // 記錄還沒有使用的長度char buf[]	// 實際進行的數據存儲
}

我們下面詳細探討一下char[]可能存在的問題,以及SDS是如何通過自身的數據結構解決的

原生string的不足
  1. 獲取字符串長度原生char[]時間復雜度為O(N)

c語言中,char[]數組的結尾事’\0’,我們如果想要獲取一個char[]數組的長度的話唯一的方法就是,不斷的從頭遍歷,直到讀到空字符,所以為了防止僅僅是獲取數組長度這個功能成為性能瓶頸,我們采用len字段記錄了char[]數組的長度

  1. 存儲 空字符

在char[]我們顯然沒有辦法直接存儲’\0’,因為我們一讀到空白符,就默認無法已經結束了,因此我們在sds中可以對這種特殊字符進行編碼,從而方便我們在寫入值時,更加靈活多樣

hash

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

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

相關文章

PostgreSQL基本操作

1.查詢某個表的所在磁盤大小 select pg_size_pretty(pg_relation_size(grb_grid)); 2.插入point類型的記錄 insert into tb_person ("name", "address", "location", "create_time", "area", "girls") values …

Java 兩個線程交替打印1-100

線程題:交替打印1-100 這里演示兩個線程,一個打印奇數,一個打印偶數 方式一:synchronized FixedThreadPool public class example {private static int count 1;private static final Object lock new Object();public stat…

WPF基礎DataGrid控件

WPF DataGrid 是一個用于顯示和編輯表格數據的強大控件。它提供了豐富的功能,包括排序、篩選、分組、編輯、選擇等,使你能夠以類似電子表格的方式呈現和操作數據。 DataGrid 的布局主要由以下部分組成: 列定義 (Columns): DataGrid 列定義了…

YOLO目標檢測——衛星遙感多類別檢測數據集下載分享【含對應voc、coco和yolo三種格式標簽】

實際項目應用:衛星遙感目標檢測數據集說明:衛星遙感多類別檢測數據集,真實場景的高質量圖片數據,數據場景豐富,含網球場、棒球場、籃球場、田徑場、儲罐、車輛、橋、飛機、船等類別標簽說明:使用lableimg標…

2023年【上海市安全員C證】考試及上海市安全員C證找解析

題庫來源:安全生產模擬考試一點通公眾號小程序 2023年上海市安全員C證考試為正在備考上海市安全員C證操作證的學員準備的理論考試專題,每個月更新的上海市安全員C證找解析祝您順利通過上海市安全員C證考試。 1、【多選題】2017年9月頒發的《中共上海市委…

基于STM32的煙霧濃度檢測報警仿真設計(仿真+程序+講解視頻)

這里寫目錄標題 📑1.主要功能📑2.仿真📑3. 程序📑4. 資料清單&下載鏈接📑[資料下載鏈接](https://docs.qq.com/doc/DS0VHTmxmUHBtVGVP) 基于STM32的煙霧濃度檢測報警仿真設計(仿真程序講解) 仿真圖prot…

【數據結構】B : DS圖應用--最短路徑

B : DS圖應用–最短路徑 文章目錄 B : DS圖應用--最短路徑DescriptionInputOutputSampleInput Output 解題思路:初始化主循環心得: AC代碼 Description 給出一個圖的鄰接矩陣,再給出指定頂點v0,求頂點v0到其他頂點的最短路徑 In…

SkyWalking配置報警推送到企業微信

1、先在企業微信群里創建一個機器人,復制webhook的地址: 2、找到SkyWalking部署位置的alarm-settings.yml文件 編輯,在最后面加上此段配置 !!!一定格式要對,不然一直報警報不出來按照網上指導…

JVM 堆外內存詳解

Java 進程內存占用除了JVM 運行時數據區,還有直接內存(Direct Memory)區域及 JVM 程序自身也會占用內存 直接內存(Direct Memory)區域:直接內存通過使用Native堆外內存來存儲數據,這意味著數據…

大數據平臺實踐之CDH6.2.1+spark3.3.0+kyuubi-1.6.0

前言:關于kyuubi的原理和功能這里不做詳細的介紹,感興趣的同學可以直通官網:https://kyuubi.readthedocs.io/en/v1.7.1-rc0/index.html 下載軟件版本 wget http://distfiles.macports.org/scala2.12/scala-2.12.16.tgz wget https://archi…

pikachu_php反序列化

pikachu_php反序列化 源代碼 class S{var $test "pikachu";function __construct(){echo $this->test;} }//O:1:"S":1:{s:4:"test";s:29:"<script>alert(xss)</script>";} $html; if(isset($_POST[o])){$s $_POST[…

基于python人臉性別年齡檢測系統-深度學習項目

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介簡介技術組成1. OpenCV2. Dlib3. TensorFlow 和 Keras 功能流程 二、功能三、系統四. 總結 一項目簡介 # Python 人臉性別年齡檢測系統介紹 簡介 該系統基…

用idea搭建一個spring cloud微服務項目

以下是使用 IntelliJ IDEA 搭建 Spring Cloud 微服務項目的步驟&#xff1a; 創建一個新的 Maven 項目。 在 pom.xml 文件中添加以下依賴&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-…

Android studio 遷移之后打開沒反應

把Android studio由d盤遷移到c盤&#xff0c;點擊沒反應&#xff1b; 需要把C:\Users\xxxx\AppData\Roaming\Google\AndroidStudio2022.3 目錄下的studio64.exe.vmoptions 修改為C:&#xff0c;刪除該文件會導致無法安裝app。 里面配置了一個

SpringMVC問題

文章目錄 SpringMVC運行流程MVC的概念與請求在MVC中的執行路徑&#xff0c;ResponsBody注解的用途SpringMVC啟動流程 SpringMVC運行流程 ? 客戶端&#xff08;瀏覽器&#xff09;發送請求&#xff0c;直接請求到 DispatcherServlet 。 ? DispatcherServlet 根據請求信息調用 …

SpringBoot問題

文章目錄 Springboot特性 Springboot特性 自動裝配&#xff1a;提供自動配置的“starter”項目對象模型&#xff08;POMS&#xff09;以簡化Maven配置。比如使用 MongoDB 時&#xff0c;只需加入 MongoDB 的 Starter 包&#xff0c;然后配置 的連接信息&#xff0c;就可以直接使…

【React-Router】路由導航

1. 概念 路由系統中的多個路由之間需要進行路由跳轉&#xff0c;并且在跳轉的同時有可能需要傳遞參數進行通信。 2. 聲明式導航 // /page/Login/index.jsimport { Link } from react-router-dom const Login () > {return <div>登錄頁{/* 解析成 a 鏈接 */}<Li…

php獲取表單以POST方式或GET方式提交的值

在php中存在兩個全局變量&#xff08;數組&#xff09;&#xff0c;其中$_GET數組用來記錄表單通過GET方式提交的數據&#xff0c;$_POST數組用來記錄表單通過POST方式提交的數據。 一、php獲取GET方式提交的值 在php中通過以下代碼來獲取&#xff1a; $_GET[name] //nam…

Windows平臺如何實現RTSP流二次編碼并添加動態水印后推送RTMP或輕量級RTSP服務

技術背景 我們在對接RTSP播放器相關的技術訴求的時候&#xff0c;遇到這樣的需求&#xff0c;客戶做特種設備巡檢的&#xff0c;需要把攝像頭拍到的RTSP流拉下來&#xff0c;然后添加動態水印后&#xff0c;再生成新的RTSP URL&#xff0c;供平臺調用。真個流程需要延遲盡可能…

Anthropic LLM論文閱讀筆記

研究時間&#xff1a;與Instrcut GPT同期的工作&#xff0c;雖然其比ChatGPT發布更晚&#xff0c;但是其實完成的時間比ChatGPT更早。與ChatGPT的應用區別&#xff1a;該模型比ChatGPT回答我不知道的概率更高。將強化學習用于大語言模型&#xff08;RLHF&#xff09;&#xff1…