目錄
前言
一、Redis主從復制
?(一)Redis主從復制介紹
?(二)基本環境準備
(三)工作原理
(四)結構模式
(五)一主一從(無密碼)
配置Master
配置Slave1
測試
(六)一主多從(無密碼)
添加Slave2
Master查看
(七)級聯復制(鏈式復制)
?將 Slave2 改為 Slave1 的 Slave
查看鏈式結構
(八)帶密碼的主從復制
配置 Master 密碼
配置Slave1認證
驗證密碼生效
?二、Redis哨兵
(一)Redis哨兵介紹
定位
核心作用
故障轉移流程
部署要點
與 Redis Cluster 的差異
(二)基本環境準備
(三)哨兵配置
Master 配置
Slave 配置
Sentinel 配置
測試
三、數據持久化
(一)RDB(Redis DataBase)快照
RDB介紹
工作原理
觸發機制
RDB的優缺點
RDB配置?
(二)AOF(追加文件)
結構與內容
刷盤策略
重寫機制
AOF的優缺點
AOF配置
(三)持久化方式對比
四、Redis 命令分類整理及常用配置項
(一)配置信息
(二) 基礎命令
(三) 數據操作命令
(四)集群命令
(五)?持久化命令
(六) 數據類型操作
(七)事務與鎖
(八)數據庫與遷移
前言
- 上一篇介紹了Redis的三大緩存問題和Redis集群的搭建,想要了解的可以參考Redis技術筆記-從三大緩存問題到高可用集群落地實戰。
- 本篇介紹Redis的主從復制和哨兵的配置及數據持久化(RDB和AOF)的實現,最后也提供了一個用來參考的Redis相關的命令和配置信息表。
一、Redis主從復制
?(一)Redis主從復制介紹
- Redis 主從復制是實現高可用性的重要機制。
- 主節點負責處理客戶端的讀寫請求,執行數據的寫入操作并維護數據的最新狀態。
- 從節點通過異步復制機制定期從主節點拉取數據,保持數據的一致性,并能夠處理只讀請求,從而實現讀寫分離,提升系統的讀取性能。
?(二)基本環境準備
- 主機準備
主機名 | IP地址 | 角色 | 密碼 |
---|---|---|---|
Redis57 | 192.168.88.57 | Master | test |
Redis58 | 192.168.88.58 | Slave1 | - |
Redis59 | 192.168.88.59 | Slave2 | - |
- 注:如無密碼,則忽略所有
requirepass
與masterauth
配置即可,配置SELINUX和關閉防火墻。
(三)工作原理
- 建立復制鏈路
- 從節點啟動后,向主節點發送
PSYNC <replid> <offset>
(2.8+ 支持部分同步;舊版發送SYNC
)。 - 主節點根據
replid
與offset
判斷是否需要 全量同步 或 增量同步。
- 從節點啟動后,向主節點發送
- 全量同步流程
- 主節點執行
fork()
創建子進程,觸發 RDB 快照。 - 子進程生成
.rdb
文件;主節點同時維護 復制積壓緩沖區(repl-backlog),記錄后續寫命令。 - RDB 文件通過 TCP 流 傳輸到從節點;傳輸期間主節點繼續處理寫請求,增量命令寫入緩沖區。
- 從節點 熱加載
.rdb
,完成基線數據恢復。 - 主節點將緩沖區中的增量指令 順序發送 給從節點,從節點實時重放,實現最終一致。
- 主節點執行
- 增量同步流程
- 當從節點掉線后重連,且斷線時間 < 緩沖區窗口期(默認 1 MB),主節點僅推送缺失指令,無需再次全量傳輸,顯著減少網絡開銷。
(四)結構模式
- 一主一從
- 最簡架構,主節點負責寫,從節點負責讀;故障時手動切換。
- 適用于讀多寫少、數據量較小的場景。
- 一主多從
- 主節點掛接多個從節點,橫向擴容讀能力。
- 從節點可部署在不同機架或可用區,提升讀性能與容災能力。
- 注意主節點網絡帶寬與
fork()
壓力。
- 級聯復制(鏈式復制)
- 主節點僅向第一層從節點同步,第一層從節點再向下一層同步,形成 主 → 從 → 從 的鏈式結構。
- 優點:減輕主節點網絡與 CPU 負載;缺點:鏈路延遲逐級累加。
(五)一主一從(無密碼)
配置Master
yum -y install redis #安裝Redis服務
vim /etc/redis.conf #修改配置文件
#69行
bind 192.168.88.57 #指定Redis服務監聽的IP地址#92行
port 6379 #指定Redis服務監聽的端口號systemctl start redis #啟動Redis服務#連接到Redis服務器查看當前Redis實例的主從復制狀態
redis-cli -h 192.168.88.57 -p 6379 info replication
#預期輸出
role:master
connected_slaves:0
配置Slave1
yum -y install redis #安裝Redis服務
vim /etc/redis.conf #修改配置文件
#69行
bind 192.168.88.58 #指定Redis服務監聽的IP地址#92行
port 6379 #指定 Redis 服務監聽的端口號systemctl start redis #啟動Redis服務redis-cli -h 192.168.88.58 -p 6379 #使用Redis客戶端連接到當前主機的Redis實例
> replicaof 192.168.88.57 6379
#將當前Redis實例(192.168.88.58:6379)配置為從節點(Replica),并指向主節點(192.168.88.57:6379)> config rewrite #將當前Redis的運行時配置寫入配置文件/etc/redis.conf,實現持久化配置
> exit #退出Redis客戶端tail -1 /etc/redis.conf #檢查配置是否成功
#輸出
replicaof 192.168.88.58 6379
測試
- 在Master寫入測試數據
#在Redis57執行
redis-cli -h 192.168.88.57 -p 6379
192.168.88.57:6379> mset k1 v1 k2 v2 k3 v3
192.168.88.57:6379> keys *
#預期輸出
1) "k1"
2) "k2"
3) "k3"
- 立即在Slave1查看是否同步
#在Redis58執行
redis-cli -h 192.168.88.58 -p 6379
192.168.88.58:6379> keys *
#預期輸出
1) "k1"
2) "k2"
3) "k3"192.168.88.58:6379> get k1
#預期輸出
"v1"
(六)一主多從(無密碼)
添加Slave2
yum -y install redis #安裝Redis服務
vim /etc/redis.conf #修改配置文件
#69行
bind 192.168.88.59 #指定Redis服務監聽的IP地址#92行
port 6379 #指定 Redis 服務監聽的端口號systemctl start redis #啟動Redis服務redis-cli -h 192.168.88.59 -p 6379 #使用Redis客戶端連接到當前主機的Redis實例
> replicaof 192.168.88.59 6379
#將當前Redis實例(192.168.88.59:6379)配置為從節點(Replica),并指向主節點(192.168.88.57:6379)> config rewrite #將當前Redis的運行時配置寫入配置文件/etc/redis.conf,實現持久化配置
> exit #退出Redis客戶端
Master查看
redis-cli -h 192.168.88.57 -p 6379 info replication#預期輸出
role:master
connected_slaves:2
(七)級聯復制(鏈式復制)
?將 Slave2 改為 Slave1 的 Slave
#Redis59主機執行
#使用Redis客戶端連接到IP地址為192.168.88.59、端口為6379的Redis實例
redis-cli -h 192.168.88.59 -p 6379#將當前Redis實例(192.168.88.59:6379)從之前的主節點中脫離,使其成為獨立的主節點
> replicaof no one#將當前Redis實例(192.168.88.59:6379)設置為從節點,并指向新的主節點192.168.88.58:6379
> replicaof 192.168.88.58 6379
> config rewrite
> exit
查看鏈式結構
#在Redis58主機執行
redis-cli -h 192.168.88.58 -p 6379 info replication#預期輸出
role:slave
master_host:192.168.88.57
connected_slaves:1
(八)帶密碼的主從復制
配置 Master 密碼
#Redis57執行
redis-cli -h 192.168.88.57 -p 6379
> config set requirepass test #動態設置Redis實例的密碼為test
> auth test #向 Redis
#服務器發送密碼test進行身份驗證,驗證成功后,才可以執行其他Redis命令(如 PING、GET 等)> config rewrite
> exittail -1 /etc/redis.conf
requirepass "test" # Redis 的配置項,用于設置密碼
配置Slave1認證
#Redis58執行
redis-cli -h 192.168.88.58 -p 6379
> config set masterauth test
#動態設置當前Redis實例的masterauth配置項為test
#masterauth是Redis從節點的配置項,用于指定連接主節點時的密碼(當主節點設置了requirepass時)> config rewrite
> exit
驗證密碼生效
#Redis57執行
redis-cli -h 192.168.88.57 -p 6379 -a test info replication
#預期輸出
connected_slaves:1#Redis58執行redis-cli -h 192.168.88.58 -p 6379
> auth test
> info replication
#預期輸出
role:slave
master_link_status:up
?二、Redis哨兵
(一)Redis哨兵介紹
定位
- Sentinel 是 Redis 官方的高可用組件,一套獨立的二進制可執行文件,與 Redis 節點松耦合部署。
- 它通過持續監控主從拓撲、自動選主、實時通知客戶端,實現“故障發現 → 故障切換 → 配置刷新”全流程閉環,全程無需人工干預。
核心作用
- 故障檢測
- 各哨兵持續向主、從節點發送 PING、INFO 與 PUBLISH 心跳;當 quorum 數量哨兵確認主節點不可達,即標記為客觀下線(ODOWN)。
- 自動故障轉移
- 哨兵集群通過 Raft-like 選舉產生唯一領頭哨兵;隨后按復制偏移量最大原則選出新主,向其余從節點發送 SLAVEOF 指令,并將新拓撲寫入 sentinel.conf。
- 配置推送
- 故障轉移完成后,哨兵通過 +switch-master 廣播新主地址;客戶端調用
sentinel get-master-addr-by-name mymaster
即可實時獲取,主流 SDK(Jedis/Lettuce/Redisson)已原生支持,無需人工介入。
- 故障轉移完成后,哨兵通過 +switch-master 廣播新主地址;客戶端調用
故障轉移流程
- 持續探測:每個哨兵每秒向主節點及所有從節點發送 PING,并收集 INFO 與 PUBLISH 心跳。
- 主觀下線:若某節點在 down-after-milliseconds 內無響應,該哨兵將其標記為 sdown(主觀下線)。
- 客觀下線:當 ≥ quorum 個哨兵報告同一節點為 sdown 時,集群將其標記為 odown(客觀下線),觸發故障轉移。
- 選主與晉升:哨兵內部通過 Raft-like 投票選出唯一的 Leader,Leader 在存活從節點中按復制偏移量、優先級、運行 ID 排序,選最優節點執行 SLAVEOF NO ONE 晉升為新主。
- 拓撲更新:Leader 向其余從節點發送 SLAVEOF new_host new_port 指令,完成數據追趕;同時向所有哨兵及客戶端廣播 +switch-master 事件,客戶端 SDK 實時刷新主節點地址,整個切換過程通常在 1–3 秒內完成。
部署要點
- 奇數個哨兵(3、5、7)跨機架部署,保證半數以上存活;
- 與 Redis 節點物理隔離,防止“一機掛全掛”;
- 在 Docker/NAT 環境開啟
sentinel announce-ip
與announce-port
,確保地址可識別; - 配置僅一行:
sentinel monitor <master-name> <ip> <port> <quorum>
。
與 Redis Cluster 的差異
- Sentinel 面向主從模式,單分片容量受單機內存限制,側重“單分片高可用”;
- Cluster 面向數據分片,橫向擴展更佳,但無內置選主,需自行實現故障轉移。
(二)基本環境準備
節點 | IP | 角色 | 端口 | 作用 |
---|---|---|---|---|
Redis60 | 192.168.88.60 | Master | 6379 | 讀寫主節點 |
Redis61 | 192.168.88.61 | Slave | 6379 | 主備切換候選 |
Redis62 | 192.168.88.62 | Sentinel | 26379 | 監控 + 故障轉移 |
(三)哨兵配置
Master 配置
yum -y install redisvim /etc/redis.conf
bind 192.168.88.60
port 6379systemctl start redis
- 驗證
redis-cli -h 192.168.88.60 -p 6379 info replication
#預期輸出
role:master
connected_slaves:0
Slave 配置
yum -y install redisvim /etc/redis.conf
bind 192.168.88.61
port 6379
replicaof 192.168.88.60 6379systemctl start redis
- 驗證
redis-cli -h 192.168.88.61 -p 6379 info replication#預期輸出
role:slave
master_host:192.168.88.60
master_link_status:up
Sentinel 配置
yum -y install redis
#哨兵服務器不需要存儲數據所以不不需要啟動redis服務vim /etc/redis-sentinel.conf
#15行
bind 192.168.88.62 #指定 Sentinel 監聽的網絡接口地址#21行
port 26379 #設置 Sentinel 的監聽端口#26行
daemonize yes #以守護進程(后臺)模式運行 Sentinel#84行
sentinel monitor mymaster 192.168.88.61 6379 1
#配置 Sentinel 監控的主節點(Master)
mymaster 用戶自定義的主節點的邏輯名稱
192.168.88.67 6379 主節點的 IP 地址和端口
1 Quorum(法定票數)表示至少需要 1 個 Sentinel 實例認為主節點不可用時,才會觸發故障轉移systemctl start redis-sentinel
systemctl enable redis-sentinel
測試
- 查看節點信息
#查看哨兵已識別拓撲
redis-cli -h 192.168.88.62 -p 26379 sentinel master mymaster#查看從節點列表
redis-cli -h 192.168.88.62 -p 26379 sentinel slaves mymaster
- 模擬主節點宕機
#Redis60執行
systemctl stop redis
- 觀察故障轉移
#等待 5-10 秒后,再次查詢哨兵
redis-cli -h 192.168.88.69 -p 26379 sentinel master mymaster#預期輸出
ip=192.168.88.61
port=6379
flags=master
- 驗證客戶端自動連接
#在任意客戶端如Redis61執行
redis-cli -h 192.168.88.62 -p 26379 sentinel get-master-addr-by-name mymaster
#預期輸出
1) "192.168.88.61"
2) "6379"
- 恢復舊主節點
systemctl start redis
- 再次查詢
#
redis-cli -h 192.168.88.62 -p 26379 sentinel slaves mymaster
#預期能看到舊主節點已變為 slave
三、數據持久化
- 基本環境準備
主機名 | IP地址 |
---|---|
Redis63 | 192.168.88.63 |
- 手動:安裝并啟動redis服務。
(一)RDB(Redis DataBase)快照
RDB介紹
- RDB 是 Redis 提供的快照型持久化方案,以“時間點一致性”為目標,把某一時刻的全部內存數據序列化為緊湊的二進制
.rdb
文件,進程重啟時可一次性完整加載。 - 文件構成:鍵值對及對應的元數據(過期時間、數據類型、編碼方式),不包含任何增量日志。
- 設計定位:專為冷備份、災難恢復以及主從復制初始同步而設計,不記錄會話級增量變化。
- 關鍵特征:
- 體積小、加載速度快,適用于海量數據的快速回滾;
- 僅保留完整快照,對兩次快照之間的變更不做記錄,因此存在分鐘級數據丟失風險。
工作原理
- 主進程收到觸發條件后,調用
fork()
創建子進程;子進程獲得父進程內存的只讀快照,并按.rdb
協議順序遍歷所有數據庫,將鍵值對及其元數據寫入臨時.rdb
文件。 - 父進程繼續處理客戶端請求,僅在
fork()
瞬間短暫阻塞;隨后所有對被修改內存頁的寫入通過寫時復制(Copy-On-Write)生成新副本,保證子進程所見數據與快照時刻完全一致。 - 子進程完成寫盤后,原子地替換舊
.rdb
文件,父進程隨后清理 COW 產生的額外內存。
觸發機制
- 手動:
BGSAVE
立即后臺快照;SAVE
會阻塞主線程,生產禁用。 - 優雅退出:執行
SHUTDOWN
或systemctl stop redis
時自動調用BGSAVE
。 - 配置規則:
- 滿足
save <seconds> <changes>
條件時自動觸發。 - 在配置文件中設定
save <seconds> <changes>
,如save 90 5
?表示 90?秒內發生≥5?次寫操作即觸發后臺快照。
- 滿足
- 主從復制:從節點執行 SYNC/PSYNC 請求時,主節點自動觸發 BGSAVE 生成 RDB 并發送給從節點完成全量同步。
RDB的優缺點
維度 | RDB 優點 | RDB 缺點 |
---|---|---|
數據粒度 | 完整快照,恢復時一次性加載 | 兩次快照之間數據可能丟失 |
文件體積 | 緊湊二進制,體積小 | 不支持增量,每次全量 |
恢復速度 | 加載極快,秒級回滾 | 無法部分恢復 |
性能影響 | fork 子進程,主線程短暫阻塞 | 大實例 fork 時內存翻倍 |
生產運維 | 易于冷備份、跨機復制 | fork 失敗風險,需監控 |
場景適用 | 冷備份、主從初始同步 | 不適用于秒級零丟失需求 |
RDB配置?
- 恢復步驟:設定觸發規則 → 寫入測試數據 → 備份快照 → 清庫并停止實例 → 覆蓋快照文件 → 啟動實例 → 驗證恢復。
- 查看默認配置:
cat /etc/redis.conf
save 900 1 # 16分鐘內至少有1次變更
save 300 10 # 5分鐘內至少有10次變更
save 60 10000 # 1分鐘內至少有10000次變更
- 修改配置文件:
vim /etc/redis.conf#修改默認配置
save 900 1
save 90 5 # 90秒內至少有5次變更
save 60 10000
- 寫入測試數據(觸發 RDB):
redis-cli -h 192.168.88.63 -p 6379
192.168.88.63:6379> mset k1 v1 k2 v2 k3 v3 k4 v4 k5 v5
- 等待 90?秒或立即強制觸發:
redis-cli -h 192.168.88.63 -p 6379 BGSAVE
- 驗證快照已生成
ls -l /var/lib/redis/dump.rdb #顯示時間戳
- 備份快照
cp /var/lib/redis/dump.rdb /tmp/dump.rdb
- 模擬災難(清空內存)
redis-cli -h 192.168.88.63 -p 6379 FLUSHALL
#FLUSHALL會刪除Redis實例中所有數據庫(默認16個數據庫)中的所有鍵值對redis-cli -h 192.168.88.63 -p 6379 keys *
- 恢復數據
systemctl stop redis
cp /tmp/dump.rdb /var/lib/redis/dump.rdb
chown redis:redis /var/lib/redis/dump.rdb
systemctl start redis
- 最終驗證
redis-cli -h 192.168.88.63 -p 6379 keys *
#預期輸出5條鍵值對
(二)AOF(追加文件)
- AOF 將每一次寫操作按順序追加到磁盤,形成可重放的指令流,保證秒級或毫秒級數據安全。
結構與內容
- 文本格式:每條寫命令及其參數、時間戳、過期標志等完整記錄。
- 無快照:全量歷史,不含二進制數據,可直接 cat 查看。
刷盤策略
策略 | 命令 | 數據安全 | 性能 | 建議場景 |
---|---|---|---|---|
always | 每條寫立即 fsync(同步) | 零丟失 | 最低 | 金融級 |
everysec(默認) | 每秒 fsync | ≤1 秒丟失 | 平衡 | 通用業務 |
no | 由 OS(操作系統) 調度 | 不可控 | 最高 | 日志類 |
重寫機制
- 自動觸發:
- 觸發條件:文件大小 ≥ 64 MB 且增長率 ≥ 100 %。
- 流程:
- fork 子進程 → 把內存快照寫成最簡指令 → 追加增量 → 原子替換舊文件。
- 手動觸發:BGREWRITEAOF(非阻塞)。
- 壓縮文本:重寫后文件體積可縮小 50 %–90 %。
AOF的優缺點
維度 | AOF 優點 | AOF 缺點 |
---|---|---|
數據安全 | 支持秒級或毫秒級持久化(always/everysec) | 極端宕機時可能丟失 1 秒數據(everysec) |
文件體積 | 可讀文本,便于人工審計 | 體積膨脹快,需定期重寫 |
恢復速度 | 需逐條重放指令,恢復慢于 RDB | 大文件恢復耗時 |
性能影響 | everysec 對主線程影響小,always 影響大 | always 模式顯著降低寫吞吐 |
運維復雜度 | 支持在線重寫、修復、截斷 | rewrite 時 CPU/IO 飆高 |
場景適用 | 金融、訂單等零容忍業務 | 對恢復速度要求極高的冷備份不適用 |
AOF配置
- 恢復步驟:啟用 AOF → 寫入數據 → 備份 appendonly.aof → 清空內存 → 停止服務 → 覆蓋文件 → 啟動實例 → 驗證數據完整性
- 啟用 AOF
redis-cli config set appendonly yes #開啟 Redis 的 AOF(Append Only File)持久化功能
redis-cli config rewrite
#將當前通過 CONFIG SET 修改的配置持久化到 Redis 的配置文件中,確保重啟后配置仍然生效
- 寫入測試數據
redis-cli -h 192.168.88.63 -p 6379 MSET a 1 b 2 c 3 #同時設置多個鍵值對
- 備份
cp /var/lib/redis/appendonly.aof /tmp/appendonly.aof
- 災難模擬
redis-cli FLUSHALL
- 恢復
systemctl stop redis
cp /tmp/appendonly.aof /var/lib/redis/appendonly.aof
chown redis:redis /var/lib/redis/appendonly.aof
systemctl start redis
- 驗證
redis-cli keys *
#預期顯示a b c三鍵
- 注:在實際應用中,RDB 和 AOF 通常結合使用以平衡性能與數據安全性:
- 金融業務等強一致性場景:
- 采用?
AOF always
(每次寫操作同步到磁盤)配合?混合持久化(aof-use-rdb-preamble yes
),通過 RDB 快照實現較快速恢復,同時通過 AOF 日志確保最小數據丟失(最多丟失緩沖區未同步的數據)。
- 采用?
- 通用業務場景:
- 采用?
AOF everysec
(每秒同步一次)配合混合持久化,在性能(減少磁盤 I/O)與數據安全性(最多丟失 1 秒數據)之間取得平衡,并通過 RDB 快照加速恢復過程。
- 采用?
- 金融業務等強一致性場景:
(三)持久化方式對比
對比維度 | RDB(快照) | AOF(追加日志) | 混合持久化(RDB+AOF) |
---|---|---|---|
持久方式 | 全量二進制快照 | 順序追加寫命令 | 快照頭 + 增量 AOF |
數據粒度 | 分鐘級 | 秒級 / 毫秒級 | 秒級 |
文件體積 | 最小(壓縮后) | 最大(可重寫瘦身) | 中等(重寫后) |
恢復速度 | 最快(一次性加載) | 較慢(逐條重放) | 快(先加載 RDB 頭,再重放尾部 AOF) |
數據安全 | 可能丟失兩次快照間全部數據 | 最多丟失 1 秒(everysec)或零丟失(always) | 與 AOF 同級,取決于刷盤策略 |
性能影響 | fork 瞬間阻塞 | everysec 影響極小,always 影響較大 | 重寫階段 CPU/IO 峰值 |
觸發條件 | 手動 BGSAVE / 優雅退出 / save 規則 / 主從同步 | 每條寫命令 / 重寫閾值 | 同 AOF,但重寫時先產生 RDB 頭 |
運維復雜度 | 低(文件單一) | 高(需重寫、修復、截斷) | 中(需監控重寫) |
生產適用場景 | 冷備份、主從初始同步、容忍分鐘級丟失 | 金融、訂單、零丟失需求 | 兼顧恢復速度與數據安全 |
四、Redis 命令分類整理及常用配置項
(一)配置信息
配置項 | 描述 | 示例 |
---|---|---|
bind <IP> | 設置監聽 IP | bind 192.168.88.64 |
port <PORT> | 設置監聽端口 | port 6379 |
requirepass <PASSWORD> | 設置連接密碼 | requirepass mySecurePassword |
daemonize yes | 以守護進程模式運行 | daemonize yes |
logfile "/var/log/redis/redis.log" | 設置日志文件路徑 | logfile "/var/log/redis/redis.log" |
dir /var/lib/redis | 設置 RDB 文件存儲目錄 | dir /var/lib/redis |
dbfilename dump.rdb | 設置 RDB 文件名 | dbfilename dump.rdb |
appendonly yes | 開啟 AOF 持久化 | appendonly yes |
appendfilename "appendonly.aof" | 設置 AOF 文件名 | appendfilename "appendonly.aof" |
save 900 1 | 設置 RDB 快照規則(900 秒內至少有 1 次寫操作) | save 900 1 |
save 300 10 | 設置 RDB 快照規則(300 秒內至少有 10 次寫操作) | save 300 10 |
save 60 10000 | 設置 RDB 快照規則(60 秒內至少有 10000 次寫操作) | save 60 10000 |
maxmemory <bytes> | 設置最大內存限制 | maxmemory 1gb |
requirepass <PASSWORD> | 設置 Redis 服務的連接密碼 | requirepass mySecurePassword |
maxmemory-policy allkeys-lru | 設置內存淘汰策略(LRU) | maxmemory-policy allkeys-lru |
(二) 基礎命令
命令 | 描述 | 示例 |
---|---|---|
yum -y install redis | 安裝 Redis | yum -y install redis |
systemctl start redis | 啟動 Redis 服務 | systemctl start redis |
systemctl enable redis | 設置 Redis 服務開機自啟 | systemctl enable redis |
systemctl stop redis | 停止 Redis 服務 | systemctl stop redis |
systemctl restart redis | 重啟 Redis 服務 | systemctl restart redis |
systemctl status redis | 查看服務狀態 | systemctl status redis |
vim /etc/redis.conf | 編輯 Redis 配置文件 | vim /etc/redis.conf |
ls /var/lib/redis/ | 查看持久化文件 | ls /var/lib/redis/ |
cp /var/lib/redis/dump.rdb <BACKUP_PATH> | 備份 RDB 文件 | cp /var/lib/redis/dump.rdb /tmp/backup.rdb |
cp <BACKUP_PATH> /var/lib/redis/dump.rdb | 恢復 RDB 文件 | cp /tmp/backup.rdb /var/lib/redis/dump.rdb |
chown -R redis:redis /var/lib/redis | 修改文件所有者 | chown -R redis:redis /var/lib/redis |
ss -utnlp | 查看 Redis 服務監聽的端口 | ss -utnlp | grep redis |
(三) 數據操作命令
命令 | 描述 | 示例 |
---|---|---|
redis-cli -h <IP> -p <PORT> -a <PASSWORD> | 連接實例 | redis-cli -h 192.168.88.64 -p 6379 -a mySecurePassword |
redis-cli -h <IP> -p <PORT> | 無密碼連接 | redis-cli -h 192.168.88.64 -p 6379 |
auth <PASSWORD> | 無密碼連接后輸入密碼 | auth mySecurePassword |
keys <PATTERN> | 查找所有匹配給定模式的鍵 | keys user:* |
keys ??? | 匹配三個字符的鍵 | keys ??? |
keys a* | 匹配以 a 開頭的鍵 | keys a* |
exists <KEY> | 檢查鍵是否存在 | exists user:1001 |
del <KEY1> <KEY2> ... | 刪除一個或多個鍵 | del user:1004 user:1003 |
type <KEY> | 查看鍵的數據類型 | type user:1001 |
ttl <KEY> | 查看鍵剩余生存時間(秒) | ttl session:1234 |
expire <KEY> <SECONDS> | 設置鍵的生存時間(秒) | expire session:1234 15 |
persist <KEY> | 移除過期時間 | persist session:1234 |
flushdb | 清空當前數據庫 | flushdb |
flushall | 清空所有數據庫 | flushall |
(四)集群命令
命令 | 描述 | 示例 |
---|---|---|
cluster-enabled <YES/NO> | 是否 啟用集群 | cluster-enabled yes |
cluster-config-file cluster-config-file <FILENAME> | 集群節點文件 | cluster-config-file nodes-6379.conf |
redis-cli --cluster create <IP1>:<PORT1> ... --cluster-replicas <N> | 創建集群 | redis-cli --cluster create 192.168.88.51:6379 192.168.88.52:6379 192.168.88.53:6379 192.168.88.54:6379 192.168.88.55:6379 192.168.88.56:6379 --cluster-replicas 1 |
redis-cli --cluster info <IP>:<PORT> | 查看集群狀態 | redis-cli --cluster info 192.168.88.51:6379 |
cluster-node-timeout <MILLISECONDS> | 集群超時 | cluster-node-timeout 5000 |
redis-cli --cluster check <IP>:<PORT> | 校驗槽完整性 | redis-cli --cluster check 192.168.88.51:6379 |
redis-cli --cluster reshard <IP>:<PORT> | 槽遷移 | redis-cli --cluster reshard 192.168.88.51:6379 |
(五)?持久化命令
命令 | 描述 | 示例 |
---|---|---|
config set <KEY> <VAL> | 運行時修改 | config set maxmemory 1gb |
config set appendonly <YES/NO> | 是否啟用 AOF | config set appendonly yes |
config get <KEY> | 查看配置 | config get maxmemory |
config rewrite | 保存運行時配置到文件 | config rewrite |
BGSAVE | 手動觸發 RDB 快照(后臺) | redis-cli BGSAVE |
BGREWRITEAOF | 手動觸發 AOF 重寫 | redis-cli BGREWRITEAOF |
LASTSAVE | 查看上次成功 RDB 時間戳 | redis-cli LASTSAVE |
redis-check-rdb <FILE> | 校驗 RDB 完整性 | redis-check-rdb /var/lib/redis/dump.rdb |
redis-check-aof <FILE> | 校驗 AOF 完整性 | redis-check-aof /var/lib/redis/appendonly.aof |
(六) 數據類型操作
- 數據類型表
數據類型 | 對應名稱 | 描述 |
---|---|---|
String(單值) | 字符串類型 | 存儲字符串值,支持多種操作,如設置、獲取、追加等。 |
Hash(對象) | 哈希類型 | 存儲鍵值對集合,類似于編程語言中的字典或對象。 |
List(隊列) | 列表類型 | 存儲有序的字符串列表,支持從頭部或尾部插入和刪除元素。 |
Set(去重) | 集合類型 | 存儲無序的字符串集合,支持集合操作,如交集、并集、差集等。 |
Sorted Set(排序) | 有序集合類型 | 存儲有序的字符串集合,每個元素關聯一個分數,支持按分數排序。 |
Bitmap(位圖) | 位圖類型 | 存儲位數組,支持對單個位的操作,適用于高效存儲布爾值。 |
HyperLogLog(去重計數) | 超日志日志類型 | 用于統計唯一元素數量,內存占用小,精度高。 |
Stream(消息流) | 流類型 | 存儲消息流,支持發布/訂閱模式,適用于消息隊列和事件流處理。 |
- 數據類型操作命令表
數據類型 | 命令 | 描述 | 示例 |
---|---|---|---|
String | |||
set?<KEY><VALUE><SECONDS> | 設置鍵值對并設置過期時間(秒) | set user:1008 "Hannah" ex 10 | |
set?<KEY><VALUE><MILLISECONDS> | 設置鍵值對并設置過期時間(毫秒) | set user:1009 "Ian" px 10000 | |
set?<KEY><VALUE> | 只在鍵不存在時設置鍵值對 | set user:1010 "Jack" NX | |
set?<KEY><VALUE> | 只在鍵存在時設置鍵值對 | set user:1010 "Julia" XX | |
get?<KEY> | 獲取鍵的值 | get user:1008 | |
mget?<KEY1><KEY2> | 獲取多個鍵的值 | mget user:1008 user:1009 | |
mset?<KEY1><VALUE1><KEY2><VALUE2> | 同時設置多個鍵值對 | mset user:1011 "Alice" user:1012 "Bob" | |
incr?<KEY> | 將鍵的值加 1 | incr user:1012 | |
incrby?<KEY><INCREMENT> | 將鍵的值增加指定的增量 | incrby user:1012 2 | |
decr?<KEY> | 將鍵的值減 1 | decr user:1012 | |
decrby?<KEY><DECREMENT> | 將鍵的值減少指定的減量 | decrby user:1012 3 | |
append?<KEY><VALUE> | 將值追加到鍵的現有值 | append user:1013 " Hello" | |
strlen?<KEY> | 獲取鍵值的長度 | strlen user:1013 | |
getrange?<KEY><START><END> | 獲取鍵值的子字符串 | getrange user:1013 0 5 | |
setrange?<KEY><OFFSET><VALUE> | 從指定偏移量處替換鍵值 | setrange user:1013 0 "Hi" | |
getset?<KEY><VALUE> | 設置新值并獲取舊值 | getset user:1013 "NewValue" | |
List | |||
lpush?<KEY><VALUE1><VALUE2> | 將值插入到列表頭部 | lpush users "Alice" "Bob" | |
rpush?<KEY><VALUE1><VALUE2> | 將值插入到列表尾部 | rpush users "Frank" "Grace" | |
lrange?<KEY><START><END> | 獲取列表的指定范圍 | lrange users 0 -1 | |
llen?<KEY> | 獲取列表的長度 | llen users | |
lindex?<KEY><INDEX> | 獲取列表中指定索引的值 | lindex users 0 | |
lset?<KEY><INDEX><VALUE> | 設置列表中指定索引的值 | lset users 0 "Alex" | |
lpop?<KEY> | 從列表頭部移除并返回值 | lpop users | |
rpop?<KEY> | 從列表尾部移除并返回值 | rpop users | |
linsert?<KEY><PIVOT><VALUE> | 在列表中指定位置插入值 | linsert users before "Charlie" "Brian" | |
lrem?<KEY><COUNT><VALUE> | 從列表中移除指定值 | lrem users 2 "Bob" | |
ltrim?<KEY><START><END> | 截取列表的指定范圍 | ltrim users 0 2 | |
Hash | |||
hset?<KEY><FIELD><VALUE> | 設置哈希表中的字段值 | hset user:1014 name "Hannah" | |
hmset?<KEY><FIELD1><VALUE1><FIELD2><VALUE2> | 同時設置多個字段值 | hmset user:1015 name "Ian" age 30 email "ian@example.com" | |
hget?<KEY><FIELD> | 獲取哈希表中指定字段的值 | hget user:1015 name | |
hmget?<KEY><FIELD1><FIELD2> | 獲取多個字段的值 | hmget user:1015 email phone | |
hgetall?<KEY> | 獲取哈希表中所有字段和值 | hgetall user:1015 | |
hkeys?<KEY> | 獲取哈希表中所有字段名 | hkeys user:1015 | |
hvals?<KEY> | 獲取哈希表中所有字段值 | hvals user:1015 | |
hdel?<KEY><FIELD> | 刪除哈希表中的字段 | hdel user:1015 email | |
hlen?<KEY> | 獲取哈希表中字段的數量 | hlen user:1015 | |
hexists?<KEY><FIELD> | 檢查字段是否存在 | hexists user:1015 age | |
Set | |||
sadd?<KEY><MEMBER1><MEMBER2> | 將成員添加到集合 | sadd hobbies "reading" "traveling" | |
smembers?<KEY> | 獲取集合中的所有成員 | smembers hobbies | |
sismember?<KEY><MEMBER> | 檢查成員是否在集合中 | sismember hobbies "traveling" | |
scard?<KEY> | 獲取集合中的成員數量 | scard hobbies | |
srem?<KEY><MEMBER> | 從集合中移除成員 | srem hobbies "gaming" | |
sunion?<KEY1><KEY2> | 獲取多個集合的并集 | sunion hobbies myhobbies | |
sinter?<KEY1><KEY2> | 獲取多個集合的交集 | sinter hobbies myhobbies | |
sdiff?<KEY1><KEY2> | 獲取多個集合的差集 | sdiff hobbies myhobbies | |
srandmember?<KEY><COUNT> | 隨機獲取集合中的成員 | srandmember myhobbies 2 | |
spop?<KEY> | 隨機移除并返回集合中的成員 | spop myhobbies | |
sdiffstore?<DESTKEY><KEY1><KEY2> | 將差集存儲到目標集合 | sdiffstore diffhobbies hobbies myhobbies | |
sunionstore?<DESTKEY><KEY1><KEY2> | 將并集存儲到目標集合 | sunionstore bothhobbies hobbies myhobbies | |
sinterstore?<DESTKEY><KEY1><KEY2> | 將交集存儲到目標集合 | sinterstore commonhobbies hobbies myhobbies | |
ZSet | |||
zadd?<KEY><SCORE1><MEMBER1><SCORE2><MEMBER2> | 將成員添加到有序集合 | zadd scores 88 "Alice" 90 "Bob" | |
zrange?<KEY><START><END> | 獲取有序集合的指定范圍 | zrange scores 0 -1 | |
zrange?<KEY><START><END> | 獲取有序集合的指定范圍及分數 | zrange scores 0 -1 withscores | |
zscore?<KEY><MEMBER> | 獲取成員的分數 | zscore scores "Alice" | |
zrangebyscore?<KEY><MIN><MAX> | 獲取有序集合中指定分數范圍的成員 | zrangebyscore scores 80 90 | |
zincrby?<KEY><INCREMENT><MEMBER> | 增加成員的分數 | zincrby scores 3 "Charlie" | |
zcount?<KEY><MIN><MAX> | 獲取有序集合中指定分數范圍的成員數量 | zcount scores 80 90 | |
zrem?<KEY><MEMBER> | 從有序集合中移除成員 | zrem scores "Charlie" | |
zrank?<KEY><MEMBER> | 獲取成員在有序集合中的排名(升序) | zrank scores "Bob" | |
zrevrank?<KEY><MEMBER> | 獲取成員在有序集合中的排名(降序) | zrevrank scores "David" | |
zcard?<KEY> | 獲取有序集合中的成員數量 | zcard scores | |
zremrangebyrank?<KEY><START><END> | 移除指定排名范圍內的成員 | zremrangebyrank scores 0 2 | |
zremrangebyscore?<KEY><MIN><MAX> | 移除指定分數范圍內的成員 | zremrangebyscore scores 80 85 | |
Bitmap | |||
setbit?<KEY><OFFSET><VALUE> | 設置位圖中指定偏移量的值 | setbit bitmap:1 0 1 | |
getbit?<KEY><OFFSET> | 獲取位圖中指定偏移量的值 | getbit bitmap:1 0 | |
bitcount?<KEY> | 獲取位圖中值為 1 的位數 | bitcount bitmap:1 | |
bitfield?<KEY><OP><OFFSET><VALUE> | 對位圖進行多種操作(如設置、獲取、自增等) | bitfield bitmap:1 set u8 0 1 | |
? | bitpos?<KEY><BIT> | 查找位圖中第一個指定值的偏移量 | bitpos bitmap:1 1 |
HyperLogLog | |||
pfadd?<KEY><ELEMENT1><ELEMENT2> | 添加元素到 HyperLogLog | pfadd hll:1 "Alice" "Bob" | |
pfcount?<KEY> | 獲取 HyperLogLog 中的近似元素個數 | pfcount hll:1 | |
pfmerge?<DESTKEY><SOURCEKEY1><SOURCEKEY2> | 合并多個 HyperLogLog | pfmerge hll:3 hll:1 hll:2 | |
Stream | |||
xadd?<KEY><ID><FIELD1><VALUE1><FIELD2><VALUE2> | 添加消息到流 | xadd stream:1 * name "Alice" age 25 | |
xread?<KEY><ID> | 讀取消息流 | xread count 2 block 0 streams stream:1 0-0 | |
xlen?<KEY> | 獲取流中的消息數量 | xlen stream:1 | |
xrange?<KEY><START><END> | 獲取流中的消息范圍 | xrange stream:1 - + | |
xdel?<KEY><ID> | 刪除流中的消息 | xdel stream:1 1626146017501-0 | |
xtrim?<KEY><MAXLEN> | 修剪流,保留指定數量的消息 | xtrim stream:1 maxlen 100 | |
xack?<KEY><GROUP><ID> | 確認消息已被消費 | xack stream:1 mygroup 1626146017501-0 | |
xpending?<KEY><GROUP> | 查看待處理的消息 | xpending stream:1 mygroup | |
xgroup create?<KEY><GROUP><ID> | 創建消費者組 | xgroup create stream:1 mygroup $ | |
xreadgroup?<GROUP><CONSUMER><KEY><ID> | 消費者組讀取消息 | xreadgroup GROUP mygroup CONSUMER alice COUNT 2 STREAMS stream:1 > |
(七)事務與鎖
命令 | 描述 | 示例 |
---|---|---|
multi | 開啟事務塊 | multi |
exec | 提交事務 | exec |
discard | 取消事務 | discard |
watch <KEY> | 樂觀鎖 | watch balance |
set <KEY> <VAL> NX PX <MSEC> | 分布式鎖 | set lock:order1 1 NX PX 30000 |
(八)數據庫與遷移
命令 | 描述 | 示例 |
---|---|---|
select <DB> | 切換數據庫 | select 3 |
move <KEY> <DB> | 遷移鍵 | move user:1 3 |
exists <KEY> | 鍵存在檢查 | exists user:1 |