天下武功,無堅不摧,唯快不破!我的名字叫 Redis,全稱是 Remote Dictionary Server。
有人說,組 CP,除了要了解她外,還要給機會讓她瞭解你。
那麼,作為開發工程師的你,是否願意認真閱讀此心法抓住機會來了解我,運用到你的系統中提升效能。
我遵守 BSD 協定,由義大利人 Salvatore Sanfilippo 使用 C 語言編寫的一個基於記憶體實現的鍵值型非關係(NoSQL)資料庫。
我是一個記憶體資料結構儲存、可作為資料庫、快取、訊息佇列、流處理引擎,速度快是我的特點。
根據官方資料,Redis 的 QPS 可以達到約 100000(每秒請求數)。
我提供了 String(字串)、Hashes(雜湊表)、Lists(列表)、Sets(無序集合)、Sorted Sets(可根據範圍查詢的排序集合)、Bitmap(點陣圖)、HyperLogLog、Geospatial (地理空間)和 Stream(流)等資料結構。
資料結構的使用技法和實現原理是你核心築基必經之路,好好修煉。
除此之外,我還具有主從複製、Lua 指令碼、LRU 淘汰機制,事務和不同級別的磁碟持久化功能,並通過 Redis Sentinel(哨兵)和 Redis Cluster(Redis 叢集)實現高可用,這部分內容,重中之重,高手必備。
我還支援一些原子操作,支援非同步複製實現快速非阻塞同步和自動重連,另外需要注意的是,推薦你在 Lunix /Unix 系統上部署,官方並沒有在 Windows 系統上構建安裝包。
程許媛:「Redis 你說了這麼多?你能幹啥?別王婆賣瓜,自賣自誇。」
快取
這是我被使用的最多的場景,能極大提升應用程式的效能。當單個 MySQL 讀寫壓力比較大,場景是讀多寫少的時候,把熱點資料儲存在更快的儲存中,也就是 Redis。
讀取資料
寫資料
至於修改資料,程式設計師想了很多方法去儘可能保證 Redis 與 MySQL 的資料一致性。
排行榜
使用 MySQL 等關係型資料庫,非常麻煩,效能也差,而直接使用 Redis SortedSet 輕鬆搞定。
訊息佇列
簡單訊息佇列,在一些不需要高可靠,但是資料量大會給 MySQL 帶來非常大壓力的場景,比如:到貨通知、未讀訊息、郵件傳送之列的。程式設計師可以使用 Lists 或者 Stream 來實現一個佇列。
分散式鎖
Redisson 這個框架,就是使用 Redis 弄出了一套分散式鎖解決方案。
計數器
Redis 的命令都是原子性的,程式設計師可以輕鬆地利用 INCR
,DECR
命令來構建計數器系統。
還有很多場景,我會在後面章節詳細道來,學完之後,我相信你定能築基鍛體,念頭通達,升職加薪。
千古無同局,葉底能否藏花,我們未來印證,願此心法能讓你學有所成,你來,我等著。
經過上一篇的 Redis 簡介,我相信你一定想繼續瞭解 Redis。本章節會通過原始碼編譯來安裝 Redis 7.0.5,讓你在自己的機器上搭建一套可以 Debug 的 Redis 7.0.5 原始碼環境。
這也是後續原理分析的基礎,推薦你部署在 macOS 或者 Linux 上搭建,如果你是 Windows 環境,那就搞一個虛擬機器器在上面裝一個 Linux 系統,再繼續搭建 Redis 環境。
程許媛:「我的電腦是 mac OS 系統,你就用這個來演示吧。」
有兩種方式,第一種是從官網下載 Redis 原始碼壓縮包,如圖 1-1 所示。
圖 1-1
將壓縮包解壓得到一個資料夾。
第二種方式,通過 git clone 獲取原始碼。
從 Github 上,使用 git clone https://github.com/redis/redis.git
指令下載,下載完成後你會得到如下檔案。
圖 1-2
進入 redis 目錄,使用 git checkout
切換到 7.0.5 這個 tag 。
gir checkout tags/7.0.5 -b 7.0.5
在編譯之前,需要安裝一些環境依賴,Redis 是 C 語言編寫的,所以還需要 gcc 編譯器。
執行 gcc -v
判斷是否安裝了編譯器。
圖 1-3
沒有安裝的話,使用如下指令安裝。
xcode-select --install
一切準備就緒,進入 redis 的原始碼目錄,執行 make
命令,這個就好比 Java 中的 mvn 命令。
make CFLAGS="-g -O0" MALLOC=jemalloc
命令後邊的 「-O0」 參數列示告訴編譯器不要優化程式碼,防止你在 Debug 的時候, IDE 裡面的 Redis 原始碼與實際執行的程式碼對應不上。
MALLOC=jemalloc
,指定在 mac OS 系統上 Redis 使用 jemalloc 記憶體分配器來分配記憶體,Linux 預設使用該分配器。
需要注意的是記憶體碎片自動清理功能只在 jemalloc 記憶體分配器生效。
如果安裝包用於生產環境的 Linux 系統上,那麼直接使用指令 make
命令即可。
編譯成功,將會看到圖 1-4 中Hint: It's a good idea to run 'make test' ;)
,提示我們可以執行單元測試,這一步可以省略。
圖 1-4
編譯成功,進入 src 原始碼目錄下,你會看到一個 redis-server 的可執行程式,使用如下指令啟動。
./redis-server ../redis.conf
圖 1-5
編譯好了,我們還差一個方便閱讀和偵錯原始碼的工具。為了方便閱讀和 debug 原始碼,極力推薦你使用 CLion 來閱讀和偵錯 Redis 原始碼,我使用的是 CLion 2021.3 版本。
安裝好以後,開啟 CLion,點選 open,選擇 Redis 原始碼目錄即可。
圖 1-6
之後檢查下 Run Debug 是否出現這些選項,選擇編輯。
圖 1-7
選擇編輯 redis-server ,指定啟動組態檔 redis.conf
的目錄,儲存。
圖 1-8
在 server.c
的main()
方法加斷點,Debug 啟動 redis -server,進行原始碼 Debug。
圖 1-9
大功告成,接下來就可以在 Redis 的知識海洋裡嗆水了。
在知識海洋嗆水之前,先來了解下 Redis 的目錄結構,從 Redis 整體目錄結構來對系統有個全域性的認識,瞭解一個系統的主要組成,同時防止陷入細節或者無從下手。
這個目錄主要包含 Redis 所依賴的第三方程式碼庫。
這是 Redis 原始碼的重要組成部分,裡面有 commands
和 modules
兩個子目錄,其餘功能模組的原始碼都在 src 目錄下,這是最重要的目錄。
modules
目錄包含了實現Redis module
的範例程式碼,commands
裡面都是 json 格式的檔案,包含了每個指令的元資訊。
顧名思義,功能模組測試和單元測試的程式碼就在這裡。
剩下的 assets、helpers、modules、support 四個目錄中是用來支撐測試功能的。
輔助性功能的指令碼或者程式碼,比如用於建立 Redis Cluster 的指令碼,lru 演演算法效果展示程式碼等。
除此之外,Redis 原始碼目錄還有兩個重要的檔案,redis.conf 和 sentinel.conf,分別用於設定 Redis 範例執行和哨兵設定。