)
前言本文內(nèi)容從特性與安裝起步逐類講解 5 種數(shù)據(jù)結(jié)構(gòu)及其內(nèi)部編碼再展開持久化、主從復(fù)制、哨兵、集群的實現(xiàn)原理最后落到緩存與分布式鎖兩類典型應(yīng)用。一、初識 RedisRedis 是一款基于內(nèi)存的鍵值對數(shù)據(jù)庫數(shù)據(jù)以 key-value 形式組織。它既可以充當(dāng)緩存也能承擔(dān)消息隊列、計數(shù)器、分布式鎖等職責(zé)是后端開發(fā)中高頻使用的組件。1.1 特性概述Redis 的特點可概括為八個方面覆蓋性能、功能與可靠性特性說明速度快數(shù)據(jù)保存在內(nèi)存中配合 C 語言實現(xiàn)與單線程模型可達(dá)到每秒萬級別訪問。基于鍵值對的數(shù)據(jù)結(jié)構(gòu)服務(wù)器value 不只是字符串還支持 hash、list、set、zset 等結(jié)構(gòu)。功能豐富提供過期策略、發(fā)布訂閱、Lua 腳本、事務(wù)、Pipeline 等額外能力。簡單穩(wěn)定單線程模型配合內(nèi)置數(shù)據(jù)結(jié)構(gòu)代碼量精簡行為容易預(yù)測??蛻舳苏Z言多C、C、Java、PHP、Python、NodeJS 等主流語言均有官方或社區(qū)客戶端。持久化通過 RDB 與 AOF 兩種策略把內(nèi)存數(shù)據(jù)保存到硬盤避免斷電或故障導(dǎo)致的數(shù)據(jù)丟失。主從復(fù)制支持多個數(shù)據(jù)副本是搭建分布式 Redis 的基礎(chǔ)。支持高可用和分布式由哨兵提供故障轉(zhuǎn)移由集群提供水平擴(kuò)展。圖 1-2 Redis 主從復(fù)制架構(gòu)1.2 使用場景Redis 的典型用途可以歸納為以下幾類緩存讀多寫少的場景配合過期時間降低后端存儲壓力。排行榜系統(tǒng)借助列表的有序性和有序集合的分?jǐn)?shù)機制構(gòu)建熱度、時間等維度的榜單。計數(shù)器視頻播放數(shù)、電商瀏覽數(shù)等需要高頻自增的指標(biāo)。分布式會話把用戶 Session 集中存放解決負(fù)載均衡下的登錄狀態(tài)丟失問題。消息隊列用 lpush brpop 實現(xiàn)生產(chǎn)者-消費者模型。分布式鎖在分布式環(huán)境下協(xié)調(diào)多進(jìn)程對共享資源的訪問。使用 Redis 也要留意邊界?!癛edis 并不是萬金油”部分場景并不適合它例如需要復(fù)雜查詢能力、或?qū)κ聞?wù)強一致有苛刻要求的業(yè)務(wù)需要結(jié)合具體問題評估。1.3 版本演進(jìn)Redis 借鑒 Linux 的版本命名版本號第二位為奇數(shù)表示非穩(wěn)定版本偶數(shù)表示穩(wěn)定版本生產(chǎn)環(huán)境通常選取偶數(shù)版本。版本特性見下表版本代表性特性2.62012服務(wù)端支持 Lua 腳本鍵過期時間支持毫秒新增 bitcount / bitop、incrbyfloat 等命令。2.82013新增部分復(fù)制降低網(wǎng)絡(luò)問題引發(fā)全量復(fù)制的頻率Redis Sentinel 第二版達(dá)到生產(chǎn)可用。3.02015推出官方分布式實現(xiàn) Redis Cluster優(yōu)化 LRU 算法與 embedded string 編碼。3.22016新增 GEO 相關(guān)功能列表新增 quicklist 編碼spop 支持個數(shù)參數(shù)。4.02017提供模塊系統(tǒng)PSYNC 2.0 解決主從切換觸發(fā)全量復(fù)制的問題引入 LFU 淘汰算法支持 RDB-AOF 混合持久化新增 unlink 異步刪除。5.02018新增流數(shù)據(jù)類型集群管理工具遷移到 C 語言實現(xiàn)。7.0當(dāng)前文檔撰寫時最新的穩(wěn)定版本延續(xù)偶數(shù)版本路線持續(xù)演進(jìn)。1.4 安裝與啟動Redis 的安裝可以從官網(wǎng)下載源碼包解壓后在根目錄執(zhí)行 make 完成編譯。啟動服務(wù)使用 redis-server進(jìn)入交互使用 redis-cli。本機默認(rèn)地址 127.0.0.1、端口 6379連接時可省略 -h 與 -p 參數(shù)$ redis-server $ redis-cli -h 127.0.0.1 -p 6379 127.0.0.1:6379 ping PONGredis-cli 的交互過程可以拆成三步客戶端發(fā)送命令、服務(wù)端執(zhí)行命令、服務(wù)端返回結(jié)果。