1. 程式人生 > >Redis原始碼分析-基礎功能(記憶體)

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等系統。最大的區別就是可以看到其中的原始碼,這正合我意。因為我一直對統計的系統很好奇,很想知道里面的執行原理是怎麼樣的,碰巧了解到有這麼一個系統,因此馬上嘗試了一下。國內關於該系統的相關資料比較匱乏,