Redis原始碼分析-基礎功能(記憶體)
Redis簡介:
Redis是一個高效能key-value儲存系統,有以下幾個優點:
1.支援資料持久化,可以將記憶體中的資料儲存到磁碟中,重啟的時候重新載入使用。
2.Redis支援簡單的字串的key-value ,並且支援比較複雜的儲存結構,例如list,set,zset, hash等。
3.Redis支援master-slave模式的資料備份機制。
4.Redis的效能極高,快速讀寫,如果把redis和客戶端放在同一臺機
器上,忽略網路頻寬的影響,一般達到60000次/s的讀寫或更高,取決於機器效能。
5.Redis所有的操作都是原子操作。
6.Redis支援pub/sub模式。
7.程式碼簡短,易於讀取。
Redis原始碼閱讀順序摘自:《如何閱讀 Redis 原始碼?》(黃建巨集老師)
Redis列表如下:
基礎資料結構分析:
閱讀程式碼的檔案如下:
(1).記憶體分配 zmalloc.c和zmalloc.h 。
(2).動態字串 sds.h和sds.c 。
(3).雙端連結串列 adlist.c和adlist.h。
(4).字典 dict.h和dict.c 。
(5).跳躍表 server.h檔案裡面關於zskiplist結構和zskiplistNode結構,以及t_zset.c中所有zsl開頭的函式,比如 zslCreate、zslInsert、zslDeleteNode等等。
(6).日誌型別 hyperloglog.c 中的 hllhdr 結構, 以及所有以 hll 開頭的函式。
原始碼分析:
(1).記憶體分配
Redis有自己管理記憶體的方式,這樣做可以利用記憶體池等方式提高記憶體分配的效能,掌控更多的記憶體資訊,以便在虛擬記憶體管理是明確何時將記憶體swap到磁碟上。
zmalloc(),Redis申請記憶體的過程除了要申請需要的size外還要申請PREFIX_SIZE,用來記錄申請記憶體塊的長度,如果申請成功,會用巨集函式
update_zmalloc_stat_alloc(size+PREFIX_SIZE, size)記錄申請的記憶體塊的相關資訊,以便監測記憶體塊的使用情況。當記憶體塊被zfree()釋放掉,
根據頭部的資訊可以快速的知道被釋放的記憶體塊的長度,然後通過巨集函式update_zmalloc_stat_free()標記釋放。
void *zmalloc(size_t size) {
void *ptr = malloc(size+PREFIX_SIZE);
if (!ptr) zmalloc_oom_handler(size);
#ifdef HAVE_MALLOC_SIZE
update_zmalloc_stat_alloc(zmalloc_size(ptr));
return ptr;
#else
*((size_t*)ptr) = size;
update_zmalloc_stat_alloc(size+PREFIX_SIZE);
return (char*)ptr+PREFIX_SIZE;
#endif
}
巨集update_zmalloc_stat_alloc()中,首先將要分配的空間與記憶體對齊,然後會根據巨集zmalloc_thread_safe判斷是否需要對 記憶體資訊記錄表的相關操作加鎖。雖然Redis在大部分場景中是單執行緒讀寫的,即thread_safe的,但啟用虛擬記憶體(VM),或 持久化dump到磁碟等操作時會啟動多執行緒,因此在多執行緒模式中,需要對部分操作加鎖。(2).記憶體監控
Redis中的used_memory記錄了redis使用的記憶體數,而多執行緒下malloc()是執行緒安全的,zmalloc_allocations[]記錄了各個size分配的記憶體塊數,大於256的按照256算。應用程式可以通過zmalloc_allocations_for_size(size)獲得對應size的記憶體塊的分配數目;也可以通過zmalloc_used_memory()獲得Redis佔用的總記憶體。這些監控類的方法在Redis的日誌系統中被用到。除了記憶體相關的操作外,Redis還提供了一個複製字串的方法zstrdup(char *),該方法將申請一塊與源字串長度相同的記憶體區域,並用memcpy()拷貝字串的內。
參考:《Redis原始碼分析》,https://www.cnblogs.com/aixiaomei/p/6311633.html
相關推薦
Redis原始碼分析-基礎功能(記憶體)
Redis簡介: Redis是一個高效能key-value儲存系統,有以下幾個優點: 1.支援資料持久化,可以將記憶體中的資料儲存到磁碟中,重啟的時候重新載入使用。 2.Redis支援簡單的字串的key-value ,並且支援比較複雜的儲存結構,例如list,set,zse
redis原始碼分析與思考(十三)——字串型別的命令實現(t_string.c)
在對字串操作的命令中,主要有增加刪查該、批處理操作以及編碼的轉換命令,現在列出對字串物件操作的主要常用命令: 常用命令表 命令 對應操作 時間複雜度
redis原始碼分析與思考(三)——字典中鍵的兩種hash演算法
在Redis字典中,得到鍵的hash值顯得尤為重要,因為這個不僅關乎到是否字典能做到負載均衡,以及在效能上優勢是否突出,一個良好的hash演算法在此時就能發揮出巨大的作用。而一個良好的has
redis原始碼分析與思考(八)——物件
談及物件,我們不免會立即聯想到Java、C++等面向物件的語言,而在C中是沒有物件這一說法的,為了方便管理與程式碼整體的優化,redis基於前面幾篇部落格的資料結構自建了一套物件系統。這個系統包含著字串物件、列表物件、雜湊物件、集合物件以及有序集合物件。
redis原始碼分析與思考(一)——sds
在閱讀黃健巨集的書《Redis設計與實現》的時候,深刻的意識到僅僅看別人的作品是遠遠不夠,自己更應該去閱讀原始碼,形成自己的思考,這樣才算真正的學進去了。 現如今,Nosql的概念大行其道,redis作為其中的佼佼者被廣大的開發者愛好著,而且Redis的原始碼僅僅只
redis原始碼分析與思考(十九)——AOF持久化
為了解決持久化檔案很龐大以及會阻塞伺服器的 情況,redis提出一種新的持久化方案:AOF持久化。AOF持久化是redis儲存資料的另外一種方式,全稱Append Only File,與RDB持久化不同的是,AOF持久化是隻儲存從客戶端鍵入
redis原始碼分析與思考(十八)——RDB持久化
redis是一個鍵值對的資料庫伺服器,伺服器中包含著若干個非空的資料庫,每個非空資料庫裡又包含著若干個鍵值對。因為redis是一個基於記憶體存貯的資料庫,他將自己所存的資料存於記憶體中,如果不將這些資料及時的儲存在硬碟中,當電腦關機或者進行
redis原始碼分析與思考(十七)——有序集合型別的命令實現(t_zset.c)
有序集合是集合的延伸,它儲存著集合元素的不可重複性,但不同的是,它是有序的,它利用每一個元素的分數來作為有序集合的排序依據,現在列出有序集合的命令: 有序集合命令 命令 對應操作 時
redis原始碼分析與思考(十六)——集合型別的命令實現(t_set.c)
集合型別是用來儲存多個字串的,與列表型別不一樣,集合中不允許有重複的元素,也不能以索引的方式來通過下標獲取值,集合中的元素還是無序的。在普通的集合上增刪查改外,集合型別還實現了多個集合的取交集、並集、差集,集合的命令如下表所示: 集合命
redis原始碼分析與思考(十五)——雜湊型別的命令實現(t_hash.c)
雜湊型別又叫做字典,在redis中,雜湊型別本身是一個鍵值對,而雜湊型別裡面也存貯著鍵值對,其對應關係是,每個雜湊型別的值對應著一個鍵值對或多對鍵值對,如圖所示: 雜湊型別命令 命令 對應操
redis原始碼分析與思考(十四)——列表型別的命令實現(t_list.c)
列表型別是用來存貯多個字串物件的結構。一個列表可以存貯232-1個元素,可以對列表兩端進行插入(push)、彈出(pop),還可以獲取指定範圍內的元素列表、獲取指定索引的元素等等,它可以靈活的充當棧和佇列的角色。下面列出列表的命令: 列
redis原始碼分析與思考(十七)——有序集合型別的命令實現(t_set.c)
有序集合是集合的延伸,它儲存著集合元素的不可重複性,但不同的是,它是有序的,它利用每一個元素的分數來作為有序集合的排序依據,現在列出有序集合的命令: 有序集合命令 命令 對應操作 時間複
React第一階段實戰分析--評論功能(二)
處理使用者輸入 首先先寫出html結構以及樣式 class CommentInput extends React.Component{ render(){ return ( <div className='comme
React第一階段實戰分析--評論功能(一)
第一步:元件劃分 元件樹表示: 第二步 元件實現 1.從元件的頂層開始,在一步步往下構建元件樹。 import React from 'react'; import CommentInput from './commentInput'; import CommentL
RecyclerView 全面使用及分析 - 基礎篇(一)
一、RecyclerView 介紹 在 RecyclerView 出來之前,大家都在使用 ListView、GridView,當然 RecyclerView 出來之後,基本上都轉向了 RecyclerView,從名字上可以看出,它能夠實現view 的複用,同樣 ListView
element-ui switch元件原始碼分析整理筆記(二)
原始碼如下: <template> <div class="el-switch" :class="{ 'is-disabled': switchDisabled, 'is-checked': checked }" role="switch" :aria-
element-ui input元件原始碼分析整理筆記(六)
input 輸入框元件 原始碼: <template> <div :class="[ type === 'textarea' ? 'el-textarea' : 'el-input', inputSize ? 'el-input--' + inputSize : ''
lua原始碼分析-gc篇(二)資料結構
1. 棧 定義 簡單的圖 2.棧元素TValue 定義 說明 3.GC物件 定義 說明 4.gc連結串列 定義 5.棧和gc連結串列的關係 答疑解惑 總結 這是這個gc系列的第二篇,這一篇主要講
Lua原始碼分析 Gc篇(一)原理
前言 原理 mark階段 sweep階段 三種顏色 資料流 參考 前言 已經有很多人寫了gc原始碼分析的文章了,自己為啥還要繼續寫呢?最主要的原因有兩個: 1.純屬對於個人來說,寫東西能夠加深自己的理解和記
開源網站流量統計系統Piwik原始碼分析——引數統計(一)
Piwik現已改名為,這是一套國外著名的開源網站統計系統,類似於百度統計、Google Analytics等系統。最大的區別就是可以看到其中的原始碼,這正合我意。因為我一直對統計的系統很好奇,很想知道里面的執行原理是怎麼樣的,碰巧了解到有這麼一個系統,因此馬上嘗試了一下。國內關於該系統的相關資料比較匱乏,