Redis命令參考
數據類型相關命令
- SET:設置鍵值,支持過期時間、不存在/存在條件。
- GET:獲取鍵值,若鍵不存在返回
nil
。 - INCR/DECR:將鍵的整數值增1/減1,鍵不存在時初始化為0。
- MSET/MGET:批量設置/獲取多個鍵值。
- LPUSH/RPUSH:從列表左/右側插入元素。
- LPOP/RPOP:移除并返回列表左/右側第一個元素。
- LRANGE:獲取列表指定范圍的元素。
- HSET/HGET:設置/獲取哈希字段值。
- HGETALL:獲取哈希所有字段和值。
- HINCRBY:哈希字段整數值增加指定數值。
- SADD/SREM:添加/移除集合元素。
- SMEMBERS:返回集合所有元素(慎用大集合)。
- SINTER/SUNION:返回多個集合的交集/并集。
- ZADD:添加帶分值的成員到有序集合。
- ZRANGE/ZREVRANGE:按分值升序/降序返回有序集合成員。
- ZINCRBY:增加有序集合成員的分值。
事務與腳本
- MULTI:開啟事務,后續命令入隊。
- EXEC:執行事務隊列中的所有命令。
- WATCH/UNWATCH:監視鍵變化,若被修改則事務中止。
- EVAL:執行Lua腳本,支持原子性操作。
- EVALSHA:通過SHA1執行緩存的腳本。
- SCRIPT LOAD:加載腳本到緩存,返回SHA1摘要。
持久化與備份
- SAVE:同步生成RDB快照,阻塞主線程。
- BGSAVE:異步生成RDB快照,子進程執行。
- LASTSAVE:返回最后一次成功生成RDB的時間戳。
- BGREWRITEAOF:異步重寫AOF文件,優化體積。
- APPEND:追加值到鍵(底層AOF操作)。
集群與高可用
- SLAVEOF/REPLICAOF:將當前節點設置為指定主節點的從節點。
- CLUSTER INFO:返回集群基本信息(狀態、槽分配)。
- CLUSTER NODES:列出集群所有節點的詳細信息。
- CLUSTER ADDSLOTS:將指定哈希槽分配給當前節點。
- SENTINEL MASTERS:列出被監控的主節點信息。
- SENTINEL GET-MASTER-ADDR-BY-NAME:獲取主節點地址。
系統管理與監控
- CLIENT LIST:列出所有客戶端連接信息。
- CLIENT KILL:關閉指定客戶端連接。
- INFO:返回服務器狀態信息(內存、CPU、復制等)。
- SLOWLOG:查看慢查詢日志。
- MONITOR:實時監控所有命令(生產環境慎用)。
高級功能
- SUBSCRIBE/PUBLISH/UNSUBSCRIBE:訂閱/發布/取消訂閱頻道消息。
- GEOADD:添加地理位置坐標。
- GEODIST:計算兩地距離。
- GEORADIUS:返回指定半徑內的位置。
其他實用命令
- KEYS/SCAN:查找匹配模式的鍵(
SCAN
非阻塞迭代)。 - TTL/PTTL:獲取鍵的剩余過期時間(秒/毫秒)。
- EXPIRE/PEXPIRE:設置鍵的過期時間(秒/毫秒)。
- TYPE:返回鍵的數據類型。
- DEL:刪除指定鍵。
事務
事務的核心命令
- MULTI:標記事務開始,后續命令按順序入隊,暫不執行。
- EXEC:執行事務隊列中的所有命令,返回各命令的結果。
- DISCARD:取消事務,清空命令隊列。
- WATCH <key>:監視指定鍵,若事務執行前鍵被修改,則事務終止(類似 CAS 機制)。
- UNWATCH:取消所有
WATCH
監控。
事務的特性
- 原子性:
EXEC
執行時,所有命令按順序一次性執行,不會被其他客戶端命令打斷。 - 無回滾:若命令入隊時語法錯誤,事務直接拒絕執行;運行時錯誤(如對字符串執行
INCR
)會繼續執行后續命令。 - 隔離性:事務執行期間不會被其他客戶端操作干擾(單線程模型保證)。
- 無持久性:是否持久化取決于 Redis 的持久化配置(RDB/AOF)。
適用場景
- 批量操作原子性:如批量更新計數器、配置項。
- 簡單 CAS 操作:結合
WATCH
實現樂觀鎖,避免競態條件(如庫存扣減、余額轉賬)。 - 非回滾型任務:無需回滾的連續操作(如日志記錄、狀態標記)。
生產環境建議
- 避免長事務:事務隊列命令過多會阻塞其他客戶端,影響性能。
- 優先使用 Lua:復雜邏輯用 Lua 腳本替代事務,減少網絡開銷。
- 合理使用 WATCH:監控最少數量的鍵,降低沖突概率。
Lua腳本
Lua 腳本的核心優勢
- 原子性:腳本整體執行,期間不會被其他命令中斷,保證數據一致性。
- 減少網絡開銷:合并多個操作到單個腳本,減少客戶端與服務端的通信次數。
- 復雜邏輯支持:支持條件判斷、循環、變量等編程結構,靈活處理業務邏輯。
- 高性能:腳本在服務端執行,避免多次網絡往返,提升吞吐量。
Lua 腳本的執行方式
-
EVAL 命令格式:
EVAL <script> <numkeys> [KEYS...] [ARGV...]
- script:Lua 腳本代碼。
- numkeys:鍵參數的數量(
KEYS
數組長度)。 - KEYS:鍵名列表(避免硬編碼,通過參數傳遞)。
- ARGV:額外參數列表(如數值、標志位)。
-
緩存腳本執行
- 預加載腳本:
SCRIPT LOAD "return redis.call('GET', KEYS[1])"
- 通過 SHA1 執行:
EVALSHA abcdef12345... 1 user:1
- 預加載腳本:
Lua 腳本與 Redis 命令的交互
-
調用 Redis 命令
-
redis.call():執行 Redis 命令,若命令出錯(如鍵不存在),直接返回錯誤并終止腳本。
local value = redis.call('GET', KEYS[1])
-
redis.pcall():執行 Redis 命令,出錯時返回 Lua 錯誤表,腳本繼續執行。
local ok, result = pcall(redis.call, 'GET', KEYS[1])
-
-
參數傳遞與返回值
-
鍵和參數分離:
KEYS
和ARGV
是 Lua 表(數組),索引從 1 開始;嚴格區分鍵和參數,避免邏輯混亂。 -
返回值處理:腳本最終返回值會被轉換為 Redis 協議格式(Lua表轉為多行回復);支持返回
nil
對應(Redis的NULL
回復)。
-
Lua 腳本的使用原則
-
原子性與阻塞
- 長時間腳本阻塞:腳本執行期間阻塞其他操作,需避免復雜循環或大量計算;單個腳本執行時間控制在ms級,必要時拆分邏輯。
-
沙盒環境限制
- 禁用危險操作:無法訪問文件系統、網絡或調用外部命令;禁止定義全局變量(需使用
local
聲明局部變量)。
- 禁用危險操作:無法訪問文件系統、網絡或調用外部命令;禁止定義全局變量(需使用
-
腳本復用性
-
參數化設計:鍵和參數通過
KEYS
/ARGV
傳遞,避免硬編碼,提高腳本通用性。 -
版本兼容性:不同 Redis 版本支持的 Lua 庫函數可能不同(如
redis.breakpoint()
僅限調試模式)。
-
排序
排序參數詳解
- ASC/DESC:升序(默認)或降序排序。
- ALPHA:按字典序排序字符串元素。
- BY <pattern>:按外部鍵的值排序(如
user:*:age
)。 - GET <pattern>:排序后返回外部鍵的值(可多次使用)。
- LIMIT offset count:分頁獲取結果(類似 SQL 的
LIMIT
)。 - STORE <key>: 將排序結果存入新鍵(列表類型)。
排序的工作原理
- 數據加載:從列表、集合或有序集合中提取元素;若使用
BY
或GET
,加載外部鍵的值到內存。 - 排序執行:默認按數值比較(
ALPHA
啟用字符串比較);使用快速排序算法,時間復雜度 O(N log N)。 - 結果處理:應用
LIMIT
分頁;按GET
返回指定數據或直接返回元素;若指定STORE
,將結果保存為新列表。
發布與訂閱
核心機制
- 角色:
- 發布者(Publisher):通過
PUBLISH <channel> <message>
發送消息到頻道。 - 訂閱者(Subscriber):通過
SUBSCRIBE <channel>
訂閱頻道,或PSUBSCRIBE <pattern>
按模式匹配訂閱(如news.*
)。 - 退訂:
UNSUBSCRIBE
或PUNSUBSCRIBE
取消訂閱。
- 發布者(Publisher):通過
- 消息傳遞:消息從發布者直接推送到所有訂閱者,無中間存儲;消息不可回溯,訂閱者斷開后重連會丟失未連接期間的消息。
關鍵命令與行為
- SUBSCRIBE channel1:訂閱指定頻道。
- PSUBSCRIBE news.*:按模式訂閱所有以
news.
開頭的頻道。 - PUBLISH channel1 “Hello”:向
channel1
發布消息 “Hello”。 - UNSUBSCRIBE:退訂所有頻道。
慢查詢日志
核心配置參數
-
slowlog-log-slower-than
-
作用:定義慢查詢的時間閾值(單位:微秒,1秒=1,000,000微秒)。
-
示例
config set slowlog-log-slower-than 10000 # 記錄超過10毫秒的命令
-
-
slowlog-max-len
-
作用:設置慢查詢日志的最大條目數(內存中存儲,先進先出)。
-
示例
config set slowlog-max-len 500 # 最多保存500條慢查詢記錄
-
查看與分析慢查詢日志
- SLOWLOG GET [n]:查看最新的n條記錄(默認全部)。
- SLOWLOG LEN`:查看當前日志條目數。
- SLOWLOG RESET:清空慢查詢日志。
監視器
MONITOR 的功能與使用
- 啟用監控:客戶端執行
MONITOR
后,Redis 會將該連接轉為監控模式,實時打印所有命令及其參數: - 輸出格式:
- 時間戳:命令執行的精確時間(秒.微秒)。
- 客戶端信息:數據庫編號、客戶端 IP 和端口。
- 命令內容:完整的命令及參數。
MONITOR 的性能影響
- 高并發寫入: 每個命令都會觸發 MONITOR 輸出,占用大量 CPU 和帶寬,可能拖慢 Redis 整體性能。
- 監控客戶端網絡延遲:MONITOR 輸出量大時,可能阻塞客戶端連接,導致其他操作延遲。
- 內存消耗:Redis 需為每個監控連接維護輸出緩沖區,內存壓力增大。