原创 redis 源碼系列(11):command 處理流程淺析

經過上一篇文章的分析,我們已經知道 redis 是如何處理 client 的請求,解析處一個完整的 command,進一步處理這個 command,並且向 client 發送響應。今天來學習一下 redis 的 command 相

原创 golang 併發(1) --- goroutine 泄漏

  最近在工作中使用 golang 編程,因爲語言內置對併發的支持(go 關鍵字),所以 golang 越來越受到服務端開發的青睞。今天的文章給大家分享一下 go 併發編程中一個比較隱晦的 bug --- goroutine 泄漏。 注意

原创 redis 源碼系列(6):實現簡單又能打 --- skiplist

跳躍表(skiplist)是一種高級數據結構,其插入、檢索、刪除的時間複雜度均爲 O(logN)。因爲其實實現簡單,很多項目將其作爲紅黑樹的一個替代品。 今天我們來看一下 redis 中 skiplist 的實現,涉及到的文件在

原创 redis 源碼系列(9):百尺高樓平地起 --- redis服務啓動

前面已經介紹了 redis 的網絡架構、通信協議,我們今天就具體看一下代碼,看看 redis 服務是如何啓動,服務 client 的。 今天不會涵蓋 sentinel、cluster 等高級概念,我們僅看看最簡單的單節點 redi

原创 redis 源碼系列(12):你們一起上吧 --- redis 事務

作爲一個數據庫,對於事務的支持是一個繞不過去的話題。今天我們來看一下 redis 中的事務相關代碼。 multiState redis 中使用 multiState 結構體來表示一個事務: typedef struct multi

原创 redis 源碼系列(15):快照 + 增量記錄 --- AOF

在介紹 rdb 的文章中,我們提到 rdb 並不能完美的解決 redis 持久化的問題。因爲其只是 redis 數據庫的某一時刻的快照,而且因爲 rdb 的 dump 過程往往會消耗大量的服務器資源,所以一般都是在業務低峯期進行,

原创 redis 源碼系列(14):1,2,3茄子 --- 數據庫快照 rdb

Redis 是一個內存數據庫,但是通過使用 rdb 和 aof 機制,redis 也支持數據持久化。今天我們來看一下 rdb 相關代碼。 redis 的 *.rdb 文件是對 redis 內存數據的二進制表示(快照),通過 *.r

原创 redis 源碼系列(16):We will call you --- PUB/SUB命令

redis 源代碼系列到現在,已經基本上介紹完了單節點 redis 服務的整體架構以及一些特別重要的特性(RDB,AOF 等),但是對於其支持的 commands 還未加以介紹。鑑於這些 commands 大多數都是建立在之前介紹

原创 redis 源碼系列(10):事件驅動編程下的網絡 IO --- 讀寫 client

今天的文章講一下 redis 是如何讀取 client 發送的數據,以及如何發送響應給 client。主要講述網絡 IO 相關內容,不會涉及到具體的 command 處理邏輯。 Why non-blocking IO 首先我們先來

原创 別讓 GC 給你的緩存系統拖後腿

golang 是一門自帶 GC(垃圾回收) 的語言,GC 幫助程序員從手動管理內存的繁瑣工作中解放出來,不僅提升了程序員的生產效率,還保護了程序員的髮際線。 天下沒有免費的午餐,GC 有時候卻可能成爲你係統性能下降的罪魁禍首,在系

原创 redis 源碼系列(7):單線程也可以很diao --- eventloop

redis 本身是一個單線程程序,但是其併發能力在開源的非關係型數據庫中卻名列前茅,這是如何做到的呢? 一個單線程程序,如何能併發處理上萬請求?redis 給出的答案是 IO 複用 + 非阻塞 IO 這對神兵利器。 在 linux

原创 redis 源碼系列(7):簡單的對象系統 --- robj

c 語言本身並不是一門面向對象編程的語言,但是很多面向對象的語言(比如 python,c++)都是用 c 來實現的。redis 代碼中,也實現了一個簡單對象系統。 今天就讓我們來學習一下,相關代碼在 src/object.c,sr

原创 duplication suppression --- 讓你的緩存更聰明

在引入緩存組件的業務體系中,下面代碼是很常見的: v = cache.get('key') if v is None: v = fetch_from_db('key') cache.set('key', v) # 本例與語言無

原创 redis 源碼系列(18):和單點說再見 --- sentinel

有了在主從節點之間同步數據的解決方案之後,我們已經有了運行多個 redis 服務的能力,但是我們仍然缺乏自動處理故障轉移的能力。sentinel 是 redis 自帶的高可用解決方案。在這個方案中有三種不同角色: master

原创 redis 源碼系列(17):分身術 --- replication

單點服務在生產環境是絕對無法接受的,但是數據庫服務,要實現多節點或者說分佈式部署,面臨的問題比 stateless 服務要多的多。數據的同步方式、一致性和可用性的妥協諸多限制,必須都加以考慮。 今天我們來學習一下 redis 主從