文章目錄
- CLI指令行
-
- 伺服器啟動
- 用戶端啟動
- 對象操作指令
-
- KEY操作
-
- Sort
- Scan
-
- SCAN 指令的基本用法
- SCAN 指令的保證
- SCAN 指令每次執行傳回的元素數量
- COUNT 選項
- MATCH 選項
- 疊代終結的保證
- String對象操作
-
- SET
- 應用場景
-
- BITCOUNT
- Hash對象操作
- List對象操作
-
- BLPOP
-
- 非阻塞行為
- 阻塞行為
- 相同的key被多個用戶端同時阻塞
- 在MULTI/EXEC事務中的BLPOP
- 場景:事件提醒
- **RPOPLPUSH**
-
- 場景
-
- 安全的隊列
- 循環清單
- **BRPOPLPUSH**
- SET對象操作
- SortedSet對象操作
-
- ZUNIONSTORE
- ZINTERSTORE
- 釋出訂閱指令
-
-
- PSUBSCRIBE
- PUBSUB
-
- 事務指令
- 連接配接指令
- 伺服器操作指令
-
- Client List
- CONFIG REWRITE
-
- 原子性重寫
- INFO
- SHUTDOWN
- Script(腳本)
CLI指令行
伺服器啟動
./redis-server /etc/redis/6379.conf
用戶端啟動
redis-cli -h host -p port -a password
對象操作指令
KEY操作
指令 | 可用版本 | 時間複雜度 | 傳回值 | 說明 |
---|---|---|---|---|
DEL key [key …] | 1.0.0 | O(1),O(M) | 被删除 的數量 | 删除給定key清單,不存在忽略 |
DUMP key | 2.6.0 | O(N*M) | 如果 不存在,那麼傳回 。 否則,傳回序列化之後的值。 | 序列化給定 ,并傳回被序列化的值, 使用 RESTORE 指令可以将這個值反序列化為 Redis 鍵。 序列化的值不包括任何生存時間資訊。 |
EXISTS key | 1.0.0 | O(1) | 若 存在,傳回 ,否則傳回 。 | 檢查給定 是否存在。 |
EXPIRE key seconds | 1.0.0 | O(1) | 設定成功傳回 。其他0 | 為給定 設定生存時間。2.6版本之後延遲精度到毫秒。 |
EXPIREAT key timestamp | 1.2.0 | O(1) | 設定成功傳回 。其他0 | 為 設定生存時間,但是設定的是UNIX 時間戳 |
KEYS pattern | 1.0.0 | O(N) | 符合給定模式的 清單。 | 查找所有符合給定模式 的 。支援*,?,[] |
MIGRATE host port key destination-db timeout [COPY] [REPLACE] | 2.6.0 | O(N) | 遷移成功時傳回 ,否則傳回相應的錯誤 | 将 原子性地從目前執行個體傳送到目标執行個體的指定資料庫上,一旦傳送成功, 保證會出現在目标執行個體上,而目前執行個體上的 會被删除。 |
MOVE key db | 1.0.0 | O(1) | 成功傳回 ,失敗則傳回 | 将目前資料庫的 移動到給定的資料庫 當中。 |
OBJECT subcommand [arguments [arguments]] | 2.2.3 | O(1) | 和 傳回數字。 傳回相應的編碼類型。 | OBJECT 指令允許從内部察看給定 的 Redis 對象 |
PERSIST key | 2.2.0 | O(1) | 成功: ,失敗: | 移除給定 的生存時間 |
PEXPIRE key milliseconds | 2.6.0 | O(1) | 成功: ,失敗: | 以毫秒為機關設定 的生存時間 |
PEXPIREAT key milliseconds-timestamp | 2.6.0 | O(1) | 成功: ,失敗: | 以毫秒為機關設定 的過期 unix 時間戳 |
PTTL key | 2.6.0 | O(1) | key -2 key -1;傳回 的剩餘生存時間 | 以毫秒為機關傳回 的剩餘生存時間 |
RANDOMKEY | 1.0.0 | O(1) | 傳回一個 | 從目前資料庫中随機傳回(不删除)一個 。 |
RENAME key newkey | 1.0.0 | O(1) | 成功: ,失敗時候傳回一個錯誤。 | 将 改名為 。當 和 相同,或者 不存在時,傳回一個錯誤。當 已經存在時, RENAME 指令将覆寫舊值。 |
RENAMENX key newkey | 1.0.0 | O(1) | 修改成功時,傳回 。如果 已經存在,傳回 。 | 當且僅當 不存在時,将 改名為 。 |
RESTORE key ttl serialized-value | 2.6.0 | O(N*M) | 成功: ,失敗時候傳回一個錯誤。 | 反序列化給定的序列化值,并将它和給定的 關聯。 |
SORT … | 太複雜,見後面詳解 | |||
TTL key | 1.0.0 | O(1) | key -2 key -1;傳回 的剩餘生存時間 | 以秒為機關,傳回給定 的剩餘生存時間(TTL, time to live)。 |
TYPE key | 1.0.0 | O(1) | (key不存在) (字元串) (清單) (集合) (有序集) (哈希表) | 傳回 所儲存的值的類型 |
SCAN … | 太複雜,見後面詳解 | |||
Sort
傳回或儲存給定清單、集合、有序集合
key
中經過排序的元素。
排序預設以數字作為對象,值被解釋為雙精度浮點數,然後進行比較。
SORT可以通過 映射來通路其他key。
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]
#簡單sort
SORT key
SORT key DESC
#字元串排序:需要加alpha參數
SORT website ALPHA
#使用 LIMIT 修飾符限制傳回結果
SORT rank LIMIT 0 5
#
#BY 選項:按其他鍵的元素來排序,而不是按key的原值排序。其他鍵指值經過處理的key。
#user_level_* 是一個占位符, 它先取出 uid 中的值, 然後再用這個值來查找相應的key。
SORT uid BY user_level_*
#GET 選項 :根據排序的結果來取出相應的key的值。
SORT uid GET user_name_*
#擷取多個外部鍵
SORT uid GET user_level_* GET user_name_*
參考:http://doc.redisfans.com/key/sort.html
Scan
SCAN 指令及其相關的 SSCAN 指令、 HSCAN 指令和 ZSCAN 指令都用于增量地疊代集合元素。
- SCAN 指令用于疊代目前資料庫中的key。
- SSCAN 指令用于疊代Set鍵中的元素。
- HSCAN 指令用于疊代Hash鍵中的鍵值對。
- ZSCAN 指令用于疊代zset中的元素(包括元素成員和元素分值)。
以上列出的四個指令都支援增量式疊代, 它們每次執行都隻會傳回少量元素, 是以這些指令可以用于生産環境, 而不會出現像 KEYS 指令、 SMEMBERS 指令帶來的問題 —— 當 KEYS 指令被用于處理一個大的資料庫時, 又或者 SMEMBERS 指令被用于處理一個大的集合鍵時, 它們可能會阻塞伺服器達數秒之久。
對鍵進行增量式疊代的過程中, 鍵可能會被修改, 是以增量式疊代指令隻能對被傳回的元素提供有限的保證
因為 SCAN 、 SSCAN 、 HSCAN 和 ZSCAN 四個指令的工作方式都非常相似, 但是:
- SSCAN 指令、 HSCAN 指令和 ZSCAN 指令的第一個參數總是一個資料庫鍵。
- 而 SCAN 指令則不需要在第一個參數提供任何資料庫鍵 —— 因為它疊代的是目前資料庫中的所有資料庫鍵。
SCAN 指令的基本用法
SCAN 指令是一個基于遊标的疊代器(cursor based iterator): SCAN 指令每次被調用之後, 都會向使用者傳回一個新的遊标, 使用者在下次疊代時需要使用這個新遊标作為 SCAN 指令的遊标參數, 以此來延續之前的疊代過程。
#第一次疊代使用 0 作為遊标, 表示開始一次新的疊代。
redis 127.0.0.1:6379> scan 0
1) "17"
2) 1) "key:12"
2) "key:8"
3) "key:4"
4) "key:14"
5) "key:16"
6) "key:17"
7) "key:15"
8) "key:10"
9) "key:3"
10) "key:7"
11) "key:1"
#第二次疊代使用的是第一次疊代時傳回的遊标, 也即是指令回複第一個元素的值 —— 17 。
redis 127.0.0.1:6379> scan 17
1) "0"
2) 1) "key:5"
2) "key:18"
3) "key:0"
4) "key:2"
5) "key:19"
6) "key:13"
7) "key:6"
8) "key:9"
9) "key:11"
以
作為遊标開始一次新的疊代, 一直調用 SCAN 指令, 直到指令傳回遊标
, 我們稱這個過程為一次完整周遊(full iteration)。
SCAN 指令的保證
SCAN 指令, 以及其他增量式疊代指令, 在進行完整周遊的情況下可以為使用者帶來以下保證: 從完整周遊開始直到完整周遊結束期間, 一直存在于資料集内的所有元素都會被完整周遊傳回; 這意味着, 如果有一個元素, 它從周遊開始直到周遊結束期間都存在于被周遊的資料集當中, 那麼 SCAN 指令總會在某次疊代中将這個元素傳回給使用者。
然而因為增量式指令僅僅使用遊标來記錄疊代狀态, 是以這些指令帶有以下缺點:
- 同一個元素可能會被傳回多次。 處理重複元素的工作交由應用程式負責, 比如說, 可以考慮将疊代傳回的元素僅僅用于可以安全地重複執行多次的操作上。
- 如果一個元素是在疊代過程中被添加到資料集的, 又或者是在疊代過程中從資料集中被删除的, 那麼這個元素可能會被傳回, 也可能不會, 這是未定義的(undefined)。
SCAN 指令每次執行傳回的元素數量
增量式疊代指令并不保證每次執行都傳回某個給定數量的元素。
增量式指令甚至可能會傳回零個元素, 但隻要指令傳回的遊标不是
, 應用程式就不應該将疊代視作結束。
不過指令傳回的元素數量總是符合一定規則的, 在實際中:
- 對于一個大資料集來說, 增量式疊代指令每次最多可能會傳回數十個元素;
- 而對于一個足夠小的資料集來說, 如果這個資料集的底層表示為編碼資料結構(encoded data structure,适用于是小集合鍵、小哈希鍵和小有序集合鍵), 那麼增量疊代指令将在一次調用中傳回資料集中的所有元素。
最後, 使用者可以通過增量式疊代指令提供的
COUNT
選項來指定每次疊代傳回元素的最大值。
COUNT 選項
雖然增量式疊代指令不保證每次疊代所傳回的元素數量, 但我們可以使用
COUNT
選項, 對指令的行為進行一定程度上的調整。
基本上,
COUNT
選項的作用就是讓使用者告知疊代指令, 在每次疊代中應該從資料集裡傳回多少元素。
雖然
COUNT
選項隻是對增量式疊代指令的一種提示(hint), 但是在大多數情況下, 這種提示都是有效的。
-
參數的預設值為COUNT
。10
- 在疊代一個足夠大的、由哈希表實作的資料庫、集合鍵、哈希鍵或者有序集合鍵時, 如果使用者沒有使用
選項, 那麼指令傳回的元素數量通常和MATCH
選項指定的一樣, 或者比COUNT
選項指定的數量稍多一些。COUNT
- 在疊代一個編碼為整數集合(intset,一個隻由整數值構成的小集合)、 或者編碼為壓縮清單(ziplist,由不同值構成的一個小哈希或者一個小有序集合)時, 增量式疊代指令通常會無視
選項指定的值, 在第一次疊代就将資料集包含的所有元素都傳回給使用者。COUNT
并非每次疊代都要使用相同的 COUNT
**值。**隻要記得将上次疊代傳回的遊标用到下次疊代裡面就可以了。
MATCH 選項
增量式疊代指令也可以通過提供一個 glob 風格的模式參數, 讓指令隻傳回和給定模式相比對的元素。
對元素的模式比對工作是在指令從資料集中取出元素之後, 向用戶端傳回元素之前的這段時間内進行的, 是以如果被疊代的資料集中隻有少量元素和模式相比對, 那麼疊代指令或許會在多次執行中都不傳回任何元素。
疊代終結的保證
增量式疊代指令所使用的算法隻保證在資料集的大小有界(bounded)的情況下, 疊代才會停止, 換句話說, 如果被疊代資料集的大小不斷地增長的話, 增量式疊代指令可能永遠也無法完成一次完整疊代。
String對象操作
指令 | 可用版本 | 時間複雜度 | 傳回值 | 說明 |
---|---|---|---|---|
APPEND key value | 2.0.0 | O(1) | 中字元串的長度 | 将 追加到 原來的值的末尾, 不存在則set key。 |
BITCOUNT key [start] [end] | 2.6.0 | O(N) | 被設定為 的位的數量。 | 計算給定字元串中,被設定為 的比特位的數量。 |
BITOP operation destkey key [key …] | 2.6.0 | O(N) | 儲存到 的字元串的長度 | 對一個或多個儲存二進制位的字元串 進行位元操作,并将結果儲存到 上。 operation AND OR NOT XOR 較短的那個字元串所缺少的部分會被看作 。NULL key也看做0 |
DECR key | 1.0.0 | O(1) | 執行 DECR 指令之後 的值 | 将 中儲存的數字值減一。 key key |
DECRBY key decrement | 1.0.0 | O(1) | 減去 之後, 的值。 | 将 中儲存的數字值減decrement。 key key |
GET key | 1.0.0 | O(1) | 不存在: ;不是String:錯誤。其他: 的值。 | 傳回 所關聯的字元串值。 |
GETBIT key offset | 2.2.0 | O(1) | 字元串值指定偏移量上的位(bit)。 | 對 所儲存的字元串值,擷取指定偏移量上的位(bit)。 |
GETRANGE key start end | 2.4.0 | O(N) | 截取得出的子字元串。 | 傳回 中字元串值的子字元串,截取範圍[ , ] 負數偏移量表示從最後開始計數, 表示最後一個字元. 值域範圍超過部分自動被符略 |
GETSET key value | 1.0.0 | O(1) | 傳回給定 的舊值。 | 将給定 的值設為 ,并傳回 的舊值(old value)。 |
INCR key | 1.0.0 | O(1) | 執行 INCR 指令之後 的值。 | 将 中儲存的數字值增一 |
INCRBY key increment | 1.0.0 | O(1) | 執行 INCR 指令之後 的值。 | 将 所儲存的值加上增量 。 |
INCRBYFLOAT key increment | 2.6.0 | O(1) | 執行指令之後 的值。 | 為 中所儲存的值加上浮點數增量 。 |
MGET key [key …] | 1.0.0 | O(N) | 一個包含所有給定 的值的清單。 | 傳回所有(一個或多個)給定 的值。 |
MSET key value [key value …] | 1.0.1 | O(N) | 總是傳回 (因為 不可能失敗) | 同時設定一個或多個 對。 |
MSETNX key value [key value …] | 1.0.1 | O(N) | 當所有 都成功設定,傳回 。其他:0 | 同時設定一個或多個 對,當且僅當所有給定 都不存在。原子性的。所有字段要麼全被設定,要麼全不被設定。 |
PSETEX key milliseconds value | 2.6.0 | O(1) | 設定成功時傳回 。 | 以毫秒為機關設定 的生存時間 |
SET … | 1.0.0 | O(1) | 2.6.12 版本以前,總是OK 2.6.12 版本開始,失敗:則傳回NULL Bulk Reply | 見後續 |
SETBIT key offset value | 2.2.0 | O(1) | 指定偏移量原來儲存的位 | 對 所儲存的字元串值,設定或清除指定偏移量上的位(bit)。 參數必須大于或等于 ,小于 2^32 (bit 映射被限制在 512 MB 之内) |
SETEX key seconds value | 2.0.0 | O(1) | 設定成功時傳回 。 | 将值 關聯到 ,并将 的生存時間設為 (以秒為機關)。 |
SETNX key value | 1.0.0 | O(1) | 設定成功,傳回 。設定失敗,傳回 。 | 将 的值設為 ,當且僅當 不存在。 |
SETRANGE key offset value | 2.2.0 | O(M) | 修改之後,字元串的長度 | 用 參數覆寫(overwrite)給定 所儲存的字元串值,從偏移量 開始。 |
STRLEN key | 2.2.0 | O(1) | 字元串值的長度。 | 傳回 所儲存的字元串值的長度。 |
SET
SET key value [EX seconds] [PX milliseconds] [NX|XX]
将字元串值
value
關聯到
key
。如果
key
已經持有其他值, SET 就覆寫舊值,無視類型。
對于某個原本帶有生存時間(TTL)的鍵來說, 當 SET 指令成功在這個鍵上執行時, 這個鍵原有的 TTL 将被清除。
從 Redis 2.6.12 版本開始, SET 指令的行為可以通過一系列參數來修改:
-
:設定鍵的過期時間為EX second
秒。second
效果等同于SET key value EX second
。SETEX key second value
-
:設定鍵的過期時間為PX millisecond
毫秒。millisecond
效果等同于SET key value PX millisecond
。PSETEX key millisecond value
-
:隻在鍵不存在時,才對鍵進行設定操作。NX
效果等同于SET key value NX
。SETNX key value
-
:隻在鍵已經存在時,才對鍵進行設定操作。XX
指令
SET resource-name anystring NX EX max-lock-time
是一種在 Redis 中實作鎖的簡單方法。
用戶端執行以上的指令:
- 如果伺服器傳回
,那麼這個用戶端獲得鎖。OK
- 如果伺服器傳回
,那麼用戶端擷取鎖失敗,可以在稍後再重試。NIL
設定的過期時間到達之後,鎖将自動釋放。
可以通過以下修改,讓這個鎖實作更健壯:
- 不使用固定的字元串作為鍵的值,而是設定一個不可猜測(non-guessable)的長随機字元串,作為密碼串(token)。
- 不使用 DEL 指令來釋放鎖,而是發送一個 Lua 腳本,這個腳本隻在用戶端傳入的值和鍵的密碼串相比對時,才對鍵進行删除。
這兩個改動可以防止持有過期鎖的用戶端誤删現有鎖的情況出現。
應用場景
BITCOUNT
使用 bitmap 實作使用者上線次數統計。
每當使用者在某一天上線的時候,我們就使用 SETBIT ,以使用者名作為
key
,将那天所代表的網站的上線日作為
offset
參數,并将這個
offset
上的為設定為
1
。如果今天是網站上線的第 100 天,而使用者 peter 在今天閱覽過網站,那麼執行指令
SETBIT peter 100 1
;如果明天 peter 也繼續閱覽網站,那麼執行指令
SETBIT peter 101 1
,以此類推。執行
BITCOUNT peter
,得出的結果就是 peter 上線的總天數。
參考:http://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/
前面的上線次數統計例子,即使運作 10 年,占用的空間也隻是每個使用者 10*365 比特位(bit),也即是每個使用者 456 位元組。對于這種大小的資料來說, BITCOUNT 的處理速度就像 GET 和 INCR 這種 O(1) 複雜度的操作一樣快。
如果你的 bitmap 資料非常大,那麼可以考慮使用以下兩種方法:
- 将一個大的 bitmap 分散到不同的 key 中,作為小的 bitmap 來處理。使用 Lua 腳本可以很友善地完成這一工作。
- 使用 BITCOUNT 的 start 和 end 參數,每次隻對所需的部分位進行計算,将位的累積工作(accumulating)放到用戶端進行,并且對結果進行緩存 (caching)。
Hash對象操作
指令 | 可用版本 | 時間複雜度 | 傳回值 | 說明 |
---|---|---|---|---|
HDEL key field [field …] | 2.0.0 | O(N) | 被成功移除的域的數量,不包括被忽略的域。 | 删除哈希表 中的一個或多個指定域,不存在的域将被忽略。 |
HEXISTS key field | 2.0.0 | O(1) | 含有給定域,傳回 。其他:0 | 檢視哈希表 中,給定域 是否存在。 |
HGET key field | 2.0.0 | O(1) | 給定域的值。 | 傳回哈希表 中給定域 的值。 |
HGETALL key | 2.0.0 | O(N) | 以清單形式傳回哈希表的域和域的值。 | 傳回哈希表 中,所有的域和值。 |
HINCRBY key field increment | 2.0.0 | O(1) | 哈希表 中域 的值。 | 為哈希表 中的域 的值加上增量 。 不存在,一個新的哈希表被建立。 不存在,域的值被初始化為 |
HINCRBYFLOAT key field increment | 2.6.0 | O(1) | 執行加法操作之後 域的值。 | 類似HINCRBY |
HKEYS key | 2.0.0 | O(N) | 一個包含哈希表中所有域的表。 | 傳回哈希表 中的所有域。 |
HLEN key | ? | O(1) | 哈希表中域的數量。 | 傳回哈希表 中域的數量。 |
HMGET key field [field …] | 2.0.0 | O(N) | 包含多個給定域的關聯值的表 | 傳回哈希表 中,一個或多個給定域的值。 |
HMSET key field value [field value …] | 2.0.0 | O(N) | 如果指令執行成功,傳回 。 | 同時将多個 (域-值)對設定到哈希表 中。 |
HSET key field value | 2.0.0 | O(1) | 新值域傳回1,存在值域 傳回0 | 将哈希表 中的域 的值設為 。 |
HSETNX key field value | 2.0.0 | O(1) | 設定成功,傳回 。域已經存在且沒有操作被執行,傳回 | 将哈希表 中的域 的值設定為 ,當且僅當域 不存在。 不存在,一個新哈希表被建立 |
HVALS key | 2.0.0 | O(N) | 一個包含哈希表中所有值的表。 | 傳回哈希表 中所有域的值。 |
HSCAN | 參考上面SCAN |
List對象操作
指令 | 可用版本 | 時間複雜度 | 傳回值 | 說明 |
---|---|---|---|---|
BLPOP key [key …] timeout | 2.0.0 | O(1) | 如果清單為空,傳回一個 。否則:[key,value] | 清單的阻塞式(blocking)彈出原語。當List内沒有任何元素時候,連接配接将被阻塞,直到等待逾時或發現可彈出元素為止。 |
BRPOP key [key …] timeout | 2.0.0 | O(1) | 如果清單為空,傳回一個 。否則:[key,value] | 類似BLPOP,隻是從後面彈出。 |
LINDEX key index | 1.0.0 | O(N) | 清單中下标為 的元素。out of range:傳回 | 傳回清單 中,下标為 的元素。 |
LINSERT key BEFORE|AFTER pivot value | 2.2.0 | O(N) | 執行成功:清單的長度。沒有找到 ,傳回 。key | 将值 插入到清單 當中,位于值 之前或之後 |
LLEN key | 1.0.0 | O(1) | 清單 的長度。 | 傳回清單 的長度。 |
LPOP key | 1.0.0 | O(1) | 清單的頭元素。 不存在時,傳回 。 | 移除并傳回清單 的頭元素。 |
LPUSH key value [value …] | 1.0.0 | O(1) | 清單的長度 | 将一個或多個值 插入到清單 的表頭。原子操作 |
LPUSHX key value | 2.2.0 | O(1) | 表的長度 | 将值 插入到清單 的表頭,當且僅當 存在并且是一個清單。 |
LRANGE key start stop | 1.0.0 | O(S+N) | 一個清單,包含指定區間内的元素。 | 傳回清單 中指定區間内的元素。[START,STOP] |
LREM key count value | 1.0.0 | O(N) | 被移除元素的數量。 | 根據參數 的值,移除清單中與參數 相等的元素。 : 從表頭, : 從表尾;count = 0:全部元素 |
LSET key index value | 1.0.0 | O(N) | 操作成功傳回 ,否則傳回錯誤資訊。 | 将清單 下标為 的元素的值設定為 。 |
LTRIM key start stop | 1.0.0 | O(N) | 指令執行成功時,傳回 。 | 讓清單隻保留指定區間内的元素,不在指定區間之内的元素都将被删除。 |
RPOP key | 1.0.0 | O(1) | 清單的尾元素。 | 移除并傳回清單 的尾元素。 |
RPUSH key value [value …] | 1.0.0 | O(1) | 表的長度。 | 将一個或多個值 插入到清單 的表尾(最右邊)。各個 值按從左到右的順序依次插入到表尾 |
RPUSHX key value | 2.2.0 | O(1) | 表的長度。 | 将值 插入到清單 的表尾,當且僅當 存在并且是一個清單。 |
BLPOP
BLPOP 是清單的阻塞式(blocking)彈出原語。
它是 LPOP 指令的阻塞版本,當給定清單内沒有任何元素可供彈出的時候,連接配接将被 BLPOP 指令阻塞,直到等待逾時或發現可彈出元素為止。
當給定多個 key 參數時,按參數 key 的先後順序依次檢查各個清單,彈出第一個非空清單的頭元素。
非阻塞行為
當 BLPOP 被調用時,如果給定 key 内至少有一個非空清單,那麼彈出遇到的第一個非空清單的頭元素,并和被彈出元素所屬的清單的名字一起,組成結果傳回給調用者。
當存在多個給定 key 時, BLPOP 按給定 key 參數排列的先後順序,依次檢查各個清單。
阻塞行為
如果所有給定 key 都不存在或包含空清單,那麼 BLPOP 指令将阻塞連接配接,直到等待逾時,或有另一個用戶端對給定 key 的任意一個執行 LPUSH 或 RPUSH 指令為止。
逾時參數 timeout 接受一個以秒為機關的數字作為值。逾時參數設為 0 表示阻塞時間可以無限期延長(block indefinitely) 。
相同的key被多個用戶端同時阻塞
相同的 key 可以被多個用戶端同時阻塞。
不同的用戶端被放進一個隊列中,按『先阻塞先服務』(first-BLPOP,first-served)的順序為 key 執行 BLPOP 指令。
在MULTI/EXEC事務中的BLPOP
BLPOP 可以用于流水線(pipline,批量地發送多個指令并讀入多個回複),但把它用在 MULTI / EXEC 塊當中沒有意義。因為這要求整個伺服器被阻塞以保證塊執行時的原子性,該行為阻止了其他用戶端執行 LPUSH 或 RPUSH 指令。
是以,一個被包裹在 MULTI / EXEC 塊内的 BLPOP 指令,行為表現得就像 LPOP 一樣,對空清單傳回 nil ,對非空清單彈出清單元素,不進行任何阻塞操作。
場景:事件提醒
有時候,為了等待一個新元素到達資料中,需要使用輪詢的方式對資料進行探查。
另一種更好的方式是,使用系統提供的阻塞原語,在新元素到達時立即進行處理,而新元素還沒到達時,就一直阻塞住,避免輪詢占用資源。
對于 Redis ,我們似乎需要一個阻塞版的 SPOP 指令,但實際上,使用 BLPOP 或者 BRPOP 就能很好地解決這個問題。
RPOPLPUSH
RPOPLPUSH source destination
指令 RPOPLPUSH 在一個原子時間内,執行以下兩個動作:
- 将清單 source 中的最後一個元素(尾元素)彈出,并傳回給用戶端。
- 将 source 彈出的元素插入到清單 destination ,作為 destination 清單的的頭元素。
如果 source 不存在,值 nil 被傳回,并且不執行其他動作。
如果 source 和 destination 相同,則清單中的表尾元素被移動到表頭,并傳回該元素,可以把這種特殊情況視作清單的旋轉(rotation)操作。
場景
安全的隊列
Redis的清單經常被用作隊列(queue),用于在不同程式之間有序地交換消息(message)。一個用戶端通過 LPUSH 指令将消息放入隊列中,而另一個用戶端通過 RPOP 或者 BRPOP 指令取出隊列中等待時間最長的消息。
不幸的是,上面的隊列方法是『不安全』的,因為在這個過程中,一個用戶端可能在取出一個消息之後崩潰,而未處理完的消息也就是以丢失。
使用 RPOPLPUSH 指令(或者它的阻塞版本 BRPOPLPUSH )可以解決這個問題:因為它不僅傳回一個消息,同時還将這個消息添加到另一個備份清單當中,如果一切正常的話,當一個用戶端完成某個消息的處理之後,可以用 LREM 指令将這個消息從備份表删除。
最後,還可以添加一個用戶端專門用于監視備份表,它自動地将超過一定處理時限的消息重新放入隊列中去(負責處理該消息的用戶端可能已經崩潰),這樣就不會丢失任何消息了。
循環清單
通過使用相同的 key 作為 RPOPLPUSH 指令的兩個參數,用戶端可以用一個接一個地擷取清單元素的方式,取得清單的所有元素,而不必像 LRANGE 指令那樣一下子将所有清單元素都從伺服器傳送到用戶端中(兩種方式的總複雜度都是 O(N))。
以上的模式甚至在以下的兩個情況下也能正常工作:
- 有多個用戶端同時對同一個清單進行旋轉(rotating),它們擷取不同的元素,直到所有元素都被讀取完,之後又從頭開始。
- 有用戶端在向清單尾部(右邊)添加新元素。
這個模式使得我們可以很容易實作這樣一類系統:有 N 個用戶端,需要連續不斷地對一些元素進行處理,而且處理的過程必須盡可能地快。一個典型的例子就是伺服器的監控程式:它們需要在盡可能短的時間内,并行地檢查一組網站,確定它們的可通路性。
注意,使用這個模式的用戶端是易于擴充(scala)且安全(reliable)的,因為就算接收到元素的用戶端失敗,元素還是儲存在清單裡面,不會丢失,等到下個疊代來臨的時候,别的用戶端又可以繼續處理這些元素了。
BRPOPLPUSH
BRPOPLPUSH source destination timeout
BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本,當給定清單
source
不為空時, BRPOPLPUSH 的表現和 RPOPLPUSH 一樣。
當清單
source
為空時, BRPOPLPUSH 指令将阻塞連接配接,直到等待逾時,或有另一個用戶端對
source
執行 LPUSH 或 RPUSH 指令為止。
逾時參數
timeout
接受一個以秒為機關的數字作為值。逾時參數設為
表示阻塞時間可以無限期延長(block indefinitely) 。
SET對象操作
指令 | 可用版本 | 時間複雜度 | 傳回值 | 說明 |
---|---|---|---|---|
SADD key member [member …] | 1.0.0 | O(N) | 被添加到集合中的新元素的數量,不包括被忽略的元素。 | 将一個或多個 元素加入到集合 當中 |
SCARD key | 1.0.0 | O(1) | 集合的基數。 | 傳回集合 的基數(集合中元素的數量)。 |
SDIFF key [key …] | 1.0.0 | O(N) | 差內建員的清單 | 所有給定集合之間的差集 |
SDIFFSTORE destination key [key …] | 1.0.0 | O(N) | 結果集中的元素數量。 | 結果儲存到 集合 |
SINTER key [key …] | 1.0.0 | O(N) | 交內建員的清單 | 所有給定集合的交集。 |
SINTERSTORE destination key [key …] | 1.0.0 | O(N) | 結果集中的元素數量。 | 結果儲存到 集合 |
SISMEMBER key member | 1.0.0 | O(1) | 元素是集合的成員,傳回 。其他:0 | 判斷 元素是否集合 的成員。 |
SMEMBERS key | 1.0.0 | O(N) | 集合中的所有成員 | 傳回集合 中的所有成員。 |
SMOVE source destination member | 1.0.0 | O(1) | 如果 元素被成功移除,傳回 。其他:0 | 将 元素從 集合移動到 集合。 |
SPOP key | 1.0.0 | O(1) | 被移除的随機元素。 | 移除并傳回集合中的一個随機元素。 |
SRANDMEMBER key [count] | 1.0.0 | O(N) | 單個元素或者集合 | 傳回集合中的一個或count個随機元素。count正數:元素不可重複;負數:元素可重複 |
SREM key member [member …] | 1.0.0 | O(N) | 被成功移除的元素的數量,不包括被忽略的元素。 | 移除集合 中的一個或多個 元素,不存在的 元素會被忽略。 |
SUNION key [key …] | 1.0.0 | O(N) | 并內建員的清單。 | 所有給定集合的并集。 |
SUNIONSTORE destination key [key …] | 1.0.0 | O(N) | 結果集中的元素數量。 | 結果儲存到 集合 |
SSCAN … | 參考Scan | |||
SortedSet對象操作
指令 | 可用版本 | 時間複雜度 | 傳回值 | 說明 |
---|---|---|---|---|
ZADD key score member [ [score member] …] | 1.2.0 | O(M*log(N)) | 被成功添加的新成員的數量,不包括那些被更新的、已經存在的成員。 | 将一個或多個 元素及其 值加入到有序集 當中。 |
ZCARD key | 1.2.0 | O(1) | 有序集的基數 | 傳回有序集 的基數。 |
ZCOUNT key min max | 2.0.0 | O(log(N)+M) | 值在 和 之間的成員的數量。 | 值在 和 之間(預設包括 值等于 或 )的成員的數量 |
ZINCRBY key increment member | 1.2.0 | O(log(N)) | 成員的新 值,以字元串形式表示。 | 的成員 的 值加上增量 。 |
ZRANGE key start stop [WITHSCORES] | 1.2.0 | O(log(N)+M) | 指定區間内,帶有 值(可選)的有序內建員的清單。 | 傳回有序集 中,指定區間内的成員。 |
ZREVRANGE key start stop [WITHSCORES] | 1.2.0 | O(log(N)+M) | 指定區間内,帶有 值(可選)的有序內建員的清單。 | 傳回有序集 中,指定區間内的成員。 值按倒序 排列 |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] | 1.0.5 | O(log(N)+M) | 指定區間内,帶有 值(可選)的有序內建員的清單。 | 傳回有序集 中,所有 值介于 和 之間(包括等于 或 )的成員。有序內建員按 值遞增(從小到大)次序排列。 |
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] | 1.0.5 | O(log(N)+M) | 指定區間内,帶有 值(可選)的有序內建員的清單。 | 傳回有序集 中,所有 值介于 和 之間(包括等于 或 )的成員。有序內建員按 值遞增(從大到小)次序排列。 |
ZRANK key member | 2.0.0 | O(log(N)) | 傳回 的排名 | 傳回有序集 中成員 的排名 |
ZREVRANK key member | 2.0.0 | O(log(N)) | 傳回 的排名 | 傳回有序集 中成員 的排名(從大到小) |
ZREM key member [member …] | 1.2.0 | O(M*log(N)) | 被成功移除的成員的數量 | 移除有序集 中的一個或多個成員 |
ZREMRANGEBYRANK key start stop | 2.0.0 | O(log(N)+M) | 被移除成員的數量 | 移除有序集 中,指定排名(rank)區間内的所有成員。 |
ZREMRANGEBYSCORE key min max | 1.2.0 | O(log(N)+M) | 被移除成員的數量 | 移除有序集 中,所有 值介于 和 之間(包括等于 或 )的成員。 |
ZSCORE key member | 1.2.0 | O(1) | 成員的 值,以字元串形式表示。 | 傳回有序集 中,成員 的 值。 |
ZUNIONSTORE | 2.0.0 | O(N)+O(M log(M)) | 儲存到 的結果集的基數。 | |
ZINTERSTORE | 2.0.0 | O(N)+O(M log(M)) | 儲存到 的結果集的基數。 | |
ZUNIONSTORE
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
計算給定的一個或多個有序集的并集,其中給定
key
的數量必須以
numkeys
參數指定,并将該并集(結果集)儲存到
destination
。
預設情況下,結果集中某個成員的
score
值是所有給定集下該成員
score
值之 和 。
WEIGHTS
使用
WEIGHTS
選項,你可以為 每個 給定有序集 分别 指定一個乘法因子(multiplication factor),每個給定有序集的所有成員的
score
值在傳遞給聚合函數(aggregation function)之前都要先乘以該有序集的因子。
如果沒有指定
WEIGHTS
選項,乘法因子預設設定為
1
。
AGGREGATE
使用
AGGREGATE
選項,你可以指定并集的結果集的聚合方式。
預設使用的參數
SUM
,可以将所有集合中某個成員的
score
值之 和 作為結果集中該成員的
score
值;使用參數
MIN
,可以将所有集合中某個成員的 最小
score
值作為結果集中該成員的
score
值;而參數
MAX
則是将所有集合中某個成員的 最大
score
值作為結果集中該成員的
score
值。
ZINTERSTORE
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
計算給定的一個或多個有序集的交集,其中給定
key
的數量必須以
numkeys
參數指定,并将該交集(結果集)儲存到
destination
。
預設情況下,結果集中某個成員的
score
值是所有給定集下該成員
score
值之和.
關于
WEIGHTS
和
AGGREGATE
選項的描述,參見 ZUNIONSTORE 指令。
釋出訂閱指令
指令 | 可用版本 | 時間複雜度 | 傳回值 | 說明 |
---|---|---|---|---|
PSUBSCRIBE pattern [pattern …] | 2.0.0 | O(N) | 接收到的資訊 | 訂閱一個或多個符合給定模式的頻道。通配符: |
PUBLISH channel message | 2.0.0 | O(N+M) | 接收到資訊 的訂閱者數量。 | 将資訊 發送到指定的頻道 。 |
PUBSUB [argument [argument …]] | 2.8.0 | 檢視訂閱與釋出系統狀态的内省指令 | ||
PUNSUBSCRIBE [pattern [pattern …]] | 2.0.0 | O(N+M) | 這個指令在不同的用戶端中有不同的表現。 | 訓示用戶端退訂所有給定模式。 |
SUBSCRIBE channel [channel …] | 2.0.0 | O(N) | 接收到的資訊 | 訂閱給定的一個或多個頻道的資訊。 |
UNSUBSCRIBE [channel [channel …]] | 2.0.0 | O(N) | 這個指令在不同的用戶端中有不同的表現。 | 訓示用戶端退訂給定的頻道。 |
PSUBSCRIBE
傳回結果說明:
# 訂閱 news.* 和 tweet.* 兩個模式
# 第 1 - 6 行是執行 psubscribe 之後的回報資訊
# 第 7 - 10 才是接收到的第一條資訊
# 第 11 - 14 是第二條
# 以此類推。。。
redis> psubscribe news.* tweet.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe" # 傳回值的類型:顯示訂閱成功
2) "news.*" # 訂閱的模式
3) (integer) 1 # 目前已訂閱的模式的數量
1) "psubscribe"
2) "tweet.*"
3) (integer) 2
1) "pmessage" # 傳回值的類型:資訊
2) "news.*" # 資訊比對的模式
3) "news.it" # 資訊本身的目标頻道
4) "Google buy Motorola" # 資訊的内容
1) "pmessage"
2) "tweet.*"
3) "tweet.huangz"
4) "hello"
1) "pmessage"
2) "tweet.*"
3) "tweet.joe"
4) "@huangz morning"
1) "pmessage"
2) "news.*"
3) "news.life"
4) "An apple a day, keep doctors away"
PUBSUB
PUBSUB CHANNELS [pattern]
列出目前的活躍頻道。
活躍頻道指的是那些至少有一個訂閱者的頻道, 訂閱模式的用戶端不計算在内。
pattern
參數是可選的:
- 如果不給出
參數,那麼列出訂閱與釋出系統中的所有活躍頻道。pattern
- 如果給出
參數,那麼隻列出和給定模式pattern
相比對的那些活躍頻道。pattern
複雜度: O(N) ,
N
為活躍頻道的數量(對于長度較短的頻道和模式來說,将進行模式比對的複雜度視為常數)。
傳回值: 一個由活躍頻道組成的清單。
PUBSUB NUMSUB [channel-1 ... channel-N]
傳回給定頻道的訂閱者數量, 訂閱模式的用戶端不計算在内。
複雜度: O(N) ,
N
為給定頻道的數量。
傳回值: 一個多條批量回複(Multi-bulk reply),回複中包含給定的頻道,以及頻道的訂閱者數量。 格式為:頻道
channel-1
,
channel-1
的訂閱者數量,頻道
channel-2
,
channel-2
的訂閱者數量,諸如此類。 回複中頻道的排列順序和執行指令時給定頻道的排列順序一緻。 不給定任何頻道而直接調用這個指令也是可以的, 在這種情況下, 指令隻傳回一個空清單。
PUBSUB NUMPAT
傳回訂閱模式的數量。
注意, 這個指令傳回的不是訂閱模式的用戶端的數量, 而是用戶端訂閱的所有模式的數量總和。
複雜度: O(1) 。
傳回值: 一個整數回複(Integer reply)。
事務指令
指令 | 可用版本 | 時間複雜度 | 傳回值 | 說明 |
---|---|---|---|---|
DISCARD | 2.0.0 | O(1) | 總是傳回 。 | 取消事務,放棄執行事務塊内的所有指令。 |
EXEC | 1.2.0 | * | 事務塊内所有指令的傳回值,按指令執行的先後順序排列。 | 執行所有事務塊内的指令。 |
MULTI | 1.2.0 | O(1) | 總是傳回 。 | 标記一個事務塊的開始。 |
UNWATCH | 2.2.0 | O(1) | 總是 。 | 取消 WATCH 指令對所有 key 的監視。 |
WATCH key [key …] | 2.2.0 | O(1) | 總是 。 | 監視一個(或多個) key |
示例:
# 事務被成功執行
redis> MULTI
OK
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> PING
QUEUED
redis> EXEC
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG
# 監視 key ,且事務成功執行
redis> WATCH lock lock_times
OK
redis> MULTI
OK
redis> SET lock "huangz"
QUEUED
redis> INCR lock_times
QUEUED
redis> EXEC
1) OK
2) (integer) 1
# 監視 key ,且事務被打斷
redis> WATCH lock lock_times
OK
redis> MULTI
OK
redis> SET lock "joe" # 就在這時,另一個用戶端修改了 lock_times 的值
QUEUED
redis> INCR lock_times
QUEUED
redis> EXEC # 因為 lock_times 被修改, joe 的事務執行失敗
(nil)
連接配接指令
指令 | 可用版本 | 時間複雜度 | 傳回值 | 說明 |
---|---|---|---|---|
AUTH password | 1.0.0 | O(1) | 密碼比對時傳回 ,否則傳回一個錯誤。 | |
ECHO message | 1.0.0 | O(1) | 自身。 | 列印一個特定的資訊 ,測試時使用。 |
PING | 1.0.0 | O(1) | 如果連接配接正常就傳回一個 ,否則傳回一個連接配接錯誤。 | 使用用戶端向 Redis 伺服器發送一個 ,如果伺服器運作正常的話,會傳回一個 。 |
QUIT | 1.0.0 | O(1) | 傳回 | 退出 |
SELECT index | 1.0.0 | O(1) | 傳回 | 切換到指定的資料庫 |
伺服器操作指令
指令 | 可用版本 | 時間複雜度 | 傳回值 | 說明 |
---|---|---|---|---|
BGREWRITEAOF | 1.0.0 | O(N) | 回報資訊 | 執行一個 AOF檔案 重寫操作。重寫會建立一個目前 AOF 檔案的體積優化版本 |
BGSAVE | 1.0.0 | O(N) | 回報資訊 | 在背景異步(Asynchronously)儲存目前資料庫的資料到磁盤。 |
CLIENT SETNAME connection-name | 2.6.9 | O(1) | 設定成功時傳回 。 | 為目前連接配接配置設定一個名字。 |
CLIENT GETNAME | 2.6.9 | O(1) | 如果連接配接沒有設定名字,那麼傳回空白回複;如果有設定名字,那麼傳回名字。 | 傳回 CLIENT SETNAME 指令為連接配接設定的名字 |
CLIENT KILL ip:port | 2.4.0 | O(N) | 當指定的用戶端存在,且被成功關閉時,傳回 。 | 關閉位址為 的用戶端。 |
CLIENT LIST | 2.4.0 | O(N) | 以人類可讀的格式,傳回所有連接配接到伺服器的用戶端資訊和統計資料。 | |
CONFIG SET parameter value | 2.0.0 | ? | 當設定成功時傳回 ,否則傳回一個錯誤。 | 動态地調整 Redis 伺服器的配置(configuration)而無須重新開機 |
CONFIG GET parameter | 2.0.0 | ? | 給定配置參數的值。 | 取得運作中的 Redis 伺服器的配置參數 |
CONFIG RESETSTAT | 2.0.0 | O(1) | 總是傳回 。 | 重置 INFO 指令中的某些統計資料 |
CONFIG REWRITE | 2.8.0 | 如果配置重寫成功則傳回 ,失敗則傳回一個錯誤。 | 啟動 Redis 伺服器時所指定的 檔案進行改寫 | |
DBSIZE | 1.0.0 | O(1) | 目前資料庫的 key 的數量。 | 傳回目前資料庫的 key 的數量。 |
DEBUG OBJECT key | 1.0.0 | O(1) | 當 存在時,傳回有關資訊。當 不存在時,傳回一個錯誤。 | 一個調試指令,它不應被用戶端所使用。 |
DEBUG SEGFAULT | 1.0.0 | 無 | 執行一個不合法的記憶體通路進而讓 Redis 崩潰,僅在開發時用于 BUG 模拟。 | |
FLUSHALL | 1.0.0 | 總是傳回 。 | 清空整個 Redis 伺服器的資料(删除所有資料庫的所有 key )。 | |
FLUSHDB | 1.0.0 | O(1) | 總是傳回 。 | 清空目前資料庫中的所有 key。 |
INFO [section] | 1.0.0 | O(1) | ||
LASTSAVE | 1.0.0 | O(1) | 一個 UNIX 時間戳。 | 傳回最近一次 Redis 成功将資料儲存到磁盤上的時間,以 UNIX 時間戳格式表示。 |
MONITOR | 1.0.0 | ? | 總是傳回 。 | 實時列印出 Redis 伺服器接收到的指令,調試用。 |
PSYNC <MASTER_RUN_ID> | 2.8.0 | ? | ? | 用于複制功能(replication)的内部指令。 |
SYNC | 1.0.0 | ? | ? | 用于複制功能(replication)的内部指令。 |
SAVE | 1.0.0 | O(N) | 儲存成功時傳回 。 | 執行一個同步儲存操作 |
SHUTDOWN | ||||
SLAVEOF host port | ||||
SLOWLOG subcommand [argument] | 2.2.12 | O(1) | 子指令:GET,RESET,LEN | |
TIME | 2.6.0 | O(1) | 一個包含兩個字元串的清單: 第一個字元串是目前時間(以 UNIX 時間戳格式表示),而第二個字元串是目前這一秒鐘已經逝去的微秒數。 | 傳回目前伺服器時間。 |
Client List
指令傳回多行字元串,這些字元串按以下形式被格式化:
- 每個已連接配接用戶端對應一行(以
分割)LF
- 每行字元串由一系列
形式的域組成,每個域之間以空格分開屬性=值
以下是域的含義:
-
: 用戶端的位址和端口addr
-
: 套接字所使用的檔案描述符fd
-
: 以秒計算的已連接配接時長age
-
: 以秒計算的空閑時長idle
-
: 用戶端 flag (見下文)flags
-
: 該用戶端正在使用的資料庫 IDdb
-
: 已訂閱頻道的數量sub
-
: 已訂閱模式的數量psub
-
: 在事務中被執行的指令數量multi
-
: 查詢緩存的長度( 表示沒有查詢在等待)qbuf
-
: 查詢緩存的剩餘空間( 表示沒有剩餘空間)qbuf-free
-
: 輸出緩存的長度obl
-
: 輸出清單的長度(當輸出緩存沒有剩餘空間時,回複被入隊到這個隊列裡)oll
-
: 輸出緩存的記憶體占用量omem
-
: 檔案描述符事件(見下文)events
-
: 最近一次執行的指令cmd
用戶端 flag 可以由以下部分組成:
-
: 用戶端是 MONITOR 模式下的附屬節點(slave)O
-
: 用戶端是一般模式下(normal)的附屬節點S
-
: 用戶端是主節點(master)M
-
: 用戶端正在執行事務x
-
: 用戶端正在等待阻塞事件b
-
: 用戶端正在等待 VM I/O 操作(已廢棄)i
-
: 一個受監視(watched)的鍵已被修改,d
指令将失敗EXEC
-
: 在将回複完整地寫出之後,關閉連結c
-
: 用戶端未被阻塞(unblocked)u
-
: 盡可能快地關閉連接配接A
-
: 未設定任何 flagN
檔案描述符事件可以是:
-
: 用戶端套接字(在事件 loop 中)是可讀的(readable)r
-
: 用戶端套接字(在事件 loop 中)是可寫的(writeable)w
CONFIG REWRITE
CONFIG REWRITE 指令對啟動 Redis 伺服器時所指定的
redis.conf
檔案進行改寫: 因為 CONFIG SET 指令可以對伺服器的目前配置進行修改, 而修改後的配置可能和
redis.conf
檔案中所描述的配置不一樣, CONFIG REWRITE 的作用就是通過盡可能少的修改, 将伺服器目前所使用的配置記錄到
redis.conf
檔案中。
重寫會以非常保守的方式進行:
- 原有
檔案的整體結構和注釋會被盡可能地保留。redis.conf
- 如果一個選項已經存在于原有
檔案中 , 那麼對該選項的重寫會在選項原本所在的位置(行号)上進行。redis.conf
- 如果一個選項不存在于原有
檔案中, 并且該選項被設定為預設值, 那麼重寫程式不會将這個選項添加到重寫後的redis.conf
檔案中。redis.conf
- 如果一個選項不存在于原有
檔案中, 并且該選項被設定為非預設值, 那麼這個選項将被添加到重寫後的redis.conf
檔案的末尾。redis.conf
- 未使用的行會被留白。 比如說, 如果你在原有
檔案上設定了數個關于redis.conf
選項的參數, 但現在你将這些save
參數的一個或全部都關閉了, 那麼這些不再使用的參數原本所在的行就會變成空白的。save
即使啟動伺服器時所指定的
redis.conf
檔案已經不再存在, CONFIG REWRITE 指令也可以重新建構并生成出一個新的
redis.conf
檔案。
另一方面, 如果啟動伺服器時沒有載入
redis.conf
檔案, 那麼執行 CONFIG REWRITE 指令将引發一個錯誤。
原子性重寫
對
redis.conf
檔案的重寫是原子性的, 并且是一緻的: 如果重寫出錯或重寫期間伺服器崩潰, 那麼重寫失敗, 原有
redis.conf
檔案不會被修改。 如果重寫成功, 那麼
redis.conf
檔案為重寫後的新檔案。
INFO
以一種易于解釋(parse)且易于閱讀的格式,傳回關于 Redis 伺服器的各種資訊和統計數值。
通過給定可選的參數
section
,可以讓指令隻傳回某一部分的資訊:
-
: 一般 Redis 伺服器資訊,包含以下域:server
-
: Redis 伺服器版本redis_version
-
: Git SHA1redis_git_sha1
-
: Git dirty flagredis_git_dirty
-
: Redis 伺服器的宿主作業系統os
-
: 架構(32 或 64 位)arch_bits
-
: Redis 所使用的事件處理機制multiplexing_api
-
: 編譯 Redis 時所使用的 GCC 版本gcc_version
-
: 伺服器程序的 PIDprocess_id
-
: Redis 伺服器的随機辨別符(用于 Sentinel 和叢集)run_id
-
: TCP/IP 監聽端口tcp_port
-
: 自 Redis 伺服器啟動以來,經過的秒數uptime_in_seconds
-
: 自 Redis 伺服器啟動以來,經過的天數uptime_in_days
-
: 以分鐘為機關進行自增的時鐘,用于 LRU 管理lru_clock
-
-
: 已連接配接用戶端資訊,包含以下域:clients
-
: 已連接配接用戶端的數量(不包括通過從屬伺服器連接配接的用戶端)connected_clients
-
: 目前連接配接的用戶端當中,最長的輸出清單client_longest_output_list
-
: 目前連接配接的用戶端當中,最大輸入緩存client_longest_input_buf
-
: 正在等待阻塞指令(BLPOP、BRPOP、BRPOPLPUSH)的用戶端的數量blocked_clients
-
-
: 記憶體資訊,包含以下域:memory
-
: 由 Redis 配置設定器配置設定的記憶體總量,以位元組(byte)為機關used_memory
-
: 以人類可讀的格式傳回 Redis 配置設定的記憶體總量used_memory_human
-
: 從作業系統的角度,傳回 Redis 已配置設定的記憶體總量(俗稱常駐集大小)。這個值和used_memory_rss
、top
等指令的輸出一緻。ps
-
: Redis 的記憶體消耗峰值(以位元組為機關)used_memory_peak
-
: 以人類可讀的格式傳回 Redis 的記憶體消耗峰值used_memory_peak_human
-
: Lua 引擎所使用的記憶體大小(以位元組為機關)used_memory_lua
-
:mem_fragmentation_ratio
和used_memory_rss
之間的比率used_memory
-
: 在編譯時指定的, Redis 所使用的記憶體配置設定器。可以是 libc 、 jemalloc 或者 tcmalloc 。mem_allocator
的值應該隻比used_memory_rss
used_memory
稍微高一點兒。
當
rss > used
,且兩者的值相差較大時,表示存在(内部或外部的)記憶體碎片。
記憶體碎片的比率可以通過
mem_fragmentation_ratio
的值看出。
當
used > rss
時,表示 Redis 的部分記憶體被作業系統換出到交換空間了,在這種情況下,操作可能會産生明顯的延遲。
Because Redis does not have control over how its allocations are mapped to memory pages, high
used_memory_rss
is often the result of a spike in memory usage.
當 Redis 釋放記憶體時,配置設定器可能會,也可能不會,将記憶體返還給作業系統。
如果 Redis 釋放了記憶體,卻沒有将記憶體返還給作業系統,那麼
used_memory
的值可能和作業系統顯示的 Redis 記憶體占用并不一緻。
檢視
的值可以驗證這種情況是否發生。used_memory_peak
-
-
:persistence
和RDB
的相關資訊AOF
-
: 一般統計資訊stats
-
: 主/從複制資訊replication
-
: CPU 計算量統計資訊cpu
-
: Redis 指令統計資訊commandstats
-
: Redis 叢集資訊cluster
-
: 資料庫相關的統計資訊keyspace
除上面給出的這些值以外,參數還可以是下面這兩個:
-
: 傳回所有資訊all
-
: 傳回預設選擇的資訊default
當不帶參數直接調用 INFO 指令時,使用
default
作為預設參數。
SHUTDOWN
SHUTDOWN 指令執行以下操作:
- 停止所有用戶端
- 如果有至少一個儲存點在等待,執行 SAVE 指令
- 如果 AOF 選項被打開,更新 AOF 檔案
- 關閉 redis 伺服器(server)
如果持久化被打開的話, SHUTDOWN 指令會保證伺服器正常關閉而不丢失任何資料。
另一方面,假如隻是單純地執行 SAVE 指令,然後再執行 QUIT 指令,則沒有這一保證 —— 因為在執行 SAVE 之後、執行 QUIT 之前的這段時間中間,其他用戶端可能正在和伺服器進行通訊,這時如果執行 QUIT 就會造成資料丢失。
SAVE 和 NOSAVE 修飾符
通過使用可選的修飾符,可以修改 SHUTDOWN 指令的表現。比如說:
- 執行
會強制讓資料庫執行儲存操作,即使沒有設定(configure)儲存點SHUTDOWN SAVE
- 執行
會阻止資料庫執行儲存操作,即使已經設定有一個或多個儲存點(你可以将這一用法看作是強制停止伺服器的一個假想的 ABORT 指令)SHUTDOWN NOSAVE
Script(腳本)
略