天天看點

redis常用指令整理CLI指令行對象操作指令釋出訂閱指令事務指令連接配接指令伺服器操作指令Script(腳本)

文章目錄

  • 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

的數量
删除給定key清單,不存在忽略
DUMP key 2.6.0 O(N*M) 如果

key

不存在,那麼傳回

nil

否則,傳回序列化之後的值。

序列化給定

key

,并傳回被序列化的值,

使用 RESTORE 指令可以将這個值反序列化為 Redis 鍵。

序列化的值不包括任何生存時間資訊。

EXISTS key 1.0.0 O(1)

key

存在,傳回

1

,否則傳回 。
檢查給定

key

是否存在。
EXPIRE key seconds 1.0.0 O(1) 設定成功傳回

1

。其他0
為給定

key

設定生存時間。2.6版本之後延遲精度到毫秒。
EXPIREAT key timestamp 1.2.0 O(1) 設定成功傳回

1

。其他0

key

設定生存時間,但是設定的是UNIX 時間戳
KEYS pattern 1.0.0 O(N) 符合給定模式的

key

清單。
查找所有符合給定模式

pattern

key

。支援*,?,[]
MIGRATE host port key destination-db timeout [COPY] [REPLACE] 2.6.0 O(N) 遷移成功時傳回

OK

,否則傳回相應的錯誤

key

原子性地從目前執行個體傳送到目标執行個體的指定資料庫上,一旦傳送成功,

key

保證會出現在目标執行個體上,而目前執行個體上的

key

會被删除。
MOVE key db 1.0.0 O(1) 成功傳回

1

,失敗則傳回
将目前資料庫的

key

移動到給定的資料庫

db

當中。
OBJECT subcommand [arguments [arguments]] 2.2.3 O(1)

REFCOUNT

IDLETIME

傳回數字。

ENCODING

傳回相應的編碼類型。
OBJECT 指令允許從内部察看給定

key

的 Redis 對象
PERSIST key 2.2.0 O(1) 成功:

1

,失敗:
移除給定

key

的生存時間
PEXPIRE key milliseconds 2.6.0 O(1) 成功:

1

,失敗:
以毫秒為機關設定

key

的生存時間
PEXPIREAT key milliseconds-timestamp 2.6.0 O(1) 成功:

1

,失敗:
以毫秒為機關設定

key

的過期 unix 時間戳
PTTL key 2.6.0 O(1) key

不存在時,傳回

-2

key

存在但沒有設定TTL時,傳回

-1;傳回

key

的剩餘生存時間
以毫秒為機關傳回

key

的剩餘生存時間
RANDOMKEY 1.0.0 O(1) 傳回一個

key

從目前資料庫中随機傳回(不删除)一個

key

RENAME key newkey 1.0.0 O(1) 成功:

OK

,失敗時候傳回一個錯誤。

key

改名為

newkey

。當

key

newkey

相同,或者

key

不存在時,傳回一個錯誤。當

newkey

已經存在時, RENAME 指令将覆寫舊值。
RENAMENX key newkey 1.0.0 O(1) 修改成功時,傳回

1

。如果

newkey

已經存在,傳回 。
當且僅當

newkey

不存在時,将

key

改名為

newkey

RESTORE key ttl serialized-value 2.6.0 O(N*M) 成功:

OK

,失敗時候傳回一個錯誤。
反序列化給定的序列化值,并将它和給定的

key

關聯。
SORT … 太複雜,見後面詳解
TTL key 1.0.0 O(1) key

不存在時,傳回

-2

key

存在但沒有設定TTL時,傳回

-1;傳回

key

的剩餘生存時間
以秒為機關,傳回給定

key

的剩餘生存時間(TTL, time to live)。
TYPE key 1.0.0 O(1)

none

(key不存在)

string

(字元串)

list

(清單)

set

(集合)

zset

(有序集)

hash

(哈希表)
傳回

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)

key

中字元串的長度

value

追加到

key

原來的值的末尾,

key

不存在則set key。
BITCOUNT key [start] [end] 2.6.0 O(N) 被設定為

1

的位的數量。
計算給定字元串中,被設定為

1

的比特位的數量。
BITOP operation destkey key [key …] 2.6.0 O(N) 儲存到

destkey

的字元串的長度
對一個或多個儲存二進制位的字元串

key

進行位元操作,并将結果儲存到

destkey

上。

operation

可以是

AND

OR

NOT

XOR

較短的那個字元串所缺少的部分會被看作

。NULL key也看做0
DECR key 1.0.0 O(1) 執行 DECR 指令之後

key

的值

key

中儲存的數字值減一。

key

不存在,那麼

key

的值會先被初始化為

DECRBY key decrement 1.0.0 O(1) 減去

decrement

之後,

key

的值。

key

中儲存的數字值減decrement。

key

不存在,那麼

key

的值會先被初始化為

GET key 1.0.0 O(1)

key

不存在:

nil

;不是String:錯誤。其他:

key

的值。
傳回

key

所關聯的字元串值。
GETBIT key offset 2.2.0 O(1) 字元串值指定偏移量上的位(bit)。

key

所儲存的字元串值,擷取指定偏移量上的位(bit)。
GETRANGE key start end 2.4.0 O(N) 截取得出的子字元串。 傳回

key

中字元串值的子字元串,截取範圍[

start

end

]

負數偏移量表示從最後開始計數,

-1

表示最後一個字元.

值域範圍超過部分自動被符略

GETSET key value 1.0.0 O(1) 傳回給定

key

的舊值。
将給定

key

的值設為

value

,并傳回

key

的舊值(old value)。
INCR key 1.0.0 O(1) 執行 INCR 指令之後

key

的值。

key

中儲存的數字值增一
INCRBY key increment 1.0.0 O(1) 執行 INCR 指令之後

key

的值。

key

所儲存的值加上增量

increment

INCRBYFLOAT key increment 2.6.0 O(1) 執行指令之後

key

的值。

key

中所儲存的值加上浮點數增量

increment

MGET key [key …] 1.0.0 O(N) 一個包含所有給定

key

的值的清單。
傳回所有(一個或多個)給定

key

的值。
MSET key value [key value …] 1.0.1 O(N) 總是傳回

OK

(因為

MSET

不可能失敗)
同時設定一個或多個

key-value

對。
MSETNX key value [key value …] 1.0.1 O(N) 當所有

key

都成功設定,傳回

1

。其他:0
同時設定一個或多個

key-value

對,當且僅當所有給定

key

都不存在。原子性的。所有字段要麼全被設定,要麼全不被設定。
PSETEX key milliseconds value 2.6.0 O(1) 設定成功時傳回

OK

以毫秒為機關設定

key

的生存時間
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) 指定偏移量原來儲存的位

key

所儲存的字元串值,設定或清除指定偏移量上的位(bit)。

offset

參數必須大于或等于 ,小于 2^32 (bit 映射被限制在 512 MB 之内)
SETEX key seconds value 2.0.0 O(1) 設定成功時傳回

OK

将值

value

關聯到

key

,并将

key

的生存時間設為

seconds

(以秒為機關)。
SETNX key value 1.0.0 O(1) 設定成功,傳回

1

。設定失敗,傳回 。

key

的值設為

value

,當且僅當

key

不存在。
SETRANGE key offset value 2.2.0 O(M) 修改之後,字元串的長度

value

參數覆寫(overwrite)給定

key

所儲存的字元串值,從偏移量

offset

開始。
STRLEN key 2.2.0 O(1) 字元串值的長度。 傳回

key

所儲存的字元串值的長度。

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) 被成功移除的域的數量,不包括被忽略的域。 删除哈希表

key

中的一個或多個指定域,不存在的域将被忽略。
HEXISTS key field 2.0.0 O(1) 含有給定域,傳回

1

。其他:0
檢視哈希表

key

中,給定域

field

是否存在。
HGET key field 2.0.0 O(1) 給定域的值。 傳回哈希表

key

中給定域

field

的值。
HGETALL key 2.0.0 O(N) 以清單形式傳回哈希表的域和域的值。 傳回哈希表

key

中,所有的域和值。
HINCRBY key field increment 2.0.0 O(1) 哈希表

key

中域

field

的值。
為哈希表

key

中的域

field

的值加上增量

increment

key

不存在,一個新的哈希表被建立。

field

不存在,域的值被初始化為
HINCRBYFLOAT key field increment 2.6.0 O(1) 執行加法操作之後

field

域的值。
類似HINCRBY
HKEYS key 2.0.0 O(N) 一個包含哈希表中所有域的表。 傳回哈希表

key

中的所有域。
HLEN key ? O(1) 哈希表中域的數量。 傳回哈希表

key

中域的數量。
HMGET key field [field …] 2.0.0 O(N) 包含多個給定域的關聯值的表 傳回哈希表

key

中,一個或多個給定域的值。
HMSET key field value [field value …] 2.0.0 O(N) 如果指令執行成功,傳回

OK

同時将多個

field-value

(域-值)對設定到哈希表

key

中。
HSET key field value 2.0.0 O(1) 新值域傳回1,存在值域 傳回0 将哈希表

key

中的域

field

的值設為

value

HSETNX key field value 2.0.0 O(1) 設定成功,傳回

1

。域已經存在且沒有操作被執行,傳回
将哈希表

key

中的域

field

的值設定為

value

,當且僅當域

field

不存在。

key

不存在,一個新哈希表被建立
HVALS key 2.0.0 O(N) 一個包含哈希表中所有值的表。 傳回哈希表

key

中所有域的值。
HSCAN 參考上面SCAN

List對象操作

指令 可用版本 時間複雜度 傳回值 說明
BLPOP key [key …] timeout 2.0.0 O(1) 如果清單為空,傳回一個

nil

。否則:[key,value]
清單的阻塞式(blocking)彈出原語。當List内沒有任何元素時候,連接配接将被阻塞,直到等待逾時或發現可彈出元素為止。
BRPOP key [key …] timeout 2.0.0 O(1) 如果清單為空,傳回一個

nil

。否則:[key,value]
類似BLPOP,隻是從後面彈出。
LINDEX key index 1.0.0 O(N) 清單中下标為

index

的元素。out of range:傳回

nil

傳回清單

key

中,下标為

index

的元素。
LINSERT key BEFORE|AFTER pivot value 2.2.0 O(N) 執行成功:清單的長度。沒有找到

pivot

,傳回

-1

。key

不存在或為空清單,傳回

将值

value

插入到清單

key

當中,位于值

pivot

之前或之後
LLEN key 1.0.0 O(1) 清單

key

的長度。
傳回清單

key

的長度。
LPOP key 1.0.0 O(1) 清單的頭元素。

key

不存在時,傳回

nil

移除并傳回清單

key

的頭元素。
LPUSH key value [value …] 1.0.0 O(1) 清單的長度 将一個或多個值

value

插入到清單

key

的表頭。原子操作
LPUSHX key value 2.2.0 O(1) 表的長度 将值

value

插入到清單

key

的表頭,當且僅當

key

存在并且是一個清單。
LRANGE key start stop 1.0.0 O(S+N) 一個清單,包含指定區間内的元素。 傳回清單

key

中指定區間内的元素。[START,STOP]
LREM key count value 1.0.0 O(N) 被移除元素的數量。 根據參數

count

的值,移除清單中與參數

value

相等的元素。

count > 0

: 從表頭,

count < 0

: 從表尾;count = 0:全部元素
LSET key index value 1.0.0 O(N) 操作成功傳回

ok

,否則傳回錯誤資訊。
将清單

key

下标為

index

的元素的值設定為

value

LTRIM key start stop 1.0.0 O(N) 指令執行成功時,傳回

ok

讓清單隻保留指定區間内的元素,不在指定區間之内的元素都将被删除。
RPOP key 1.0.0 O(1) 清單的尾元素。 移除并傳回清單

key

的尾元素。
RPUSH key value [value …] 1.0.0 O(1) 表的長度。 将一個或多個值

value

插入到清單

key

的表尾(最右邊)。各個

value

值按從左到右的順序依次插入到表尾
RPUSHX key value 2.2.0 O(1) 表的長度。 将值

value

插入到清單

key

的表尾,當且僅當

key

存在并且是一個清單。

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 在一個原子時間内,執行以下兩個動作:

  1. 将清單 source 中的最後一個元素(尾元素)彈出,并傳回給用戶端。
  2. 将 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) 被添加到集合中的新元素的數量,不包括被忽略的元素。 将一個或多個

member

元素加入到集合

key

當中
SCARD key 1.0.0 O(1) 集合的基數。 傳回集合

key

的基數(集合中元素的數量)。
SDIFF key [key …] 1.0.0 O(N) 差內建員的清單 所有給定集合之間的差集
SDIFFSTORE destination key [key …] 1.0.0 O(N) 結果集中的元素數量。 結果儲存到

destination

集合
SINTER key [key …] 1.0.0 O(N) 交內建員的清單 所有給定集合的交集。
SINTERSTORE destination key [key …] 1.0.0 O(N) 結果集中的元素數量。 結果儲存到

destination

集合
SISMEMBER key member 1.0.0 O(1) 元素是集合的成員,傳回

1

。其他:0
判斷

member

元素是否集合

key

的成員。
SMEMBERS key 1.0.0 O(N) 集合中的所有成員 傳回集合

key

中的所有成員。
SMOVE source destination member 1.0.0 O(1) 如果

member

元素被成功移除,傳回

1

。其他:0

member

元素從

source

集合移動到

destination

集合。
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) 被成功移除的元素的數量,不包括被忽略的元素。 移除集合

key

中的一個或多個

member

元素,不存在的

member

元素會被忽略。
SUNION key [key …] 1.0.0 O(N) 并內建員的清單。 所有給定集合的并集。
SUNIONSTORE destination key [key …] 1.0.0 O(N) 結果集中的元素數量。 結果儲存到

destination

集合
SSCAN … 參考Scan

SortedSet對象操作

指令 可用版本 時間複雜度 傳回值 說明
ZADD key score member [ [score member] …] 1.2.0 O(M*log(N)) 被成功添加的新成員的數量,不包括那些被更新的、已經存在的成員。 将一個或多個

member

元素及其

score

值加入到有序集

key

當中。
ZCARD key 1.2.0 O(1) 有序集的基數 傳回有序集

key

的基數。
ZCOUNT key min max 2.0.0 O(log(N)+M)

score

值在

min

max

之間的成員的數量。

score

值在

min

max

之間(預設包括

score

值等于

min

max

)的成員的數量
ZINCRBY key increment member 1.2.0 O(log(N))

member

成員的新

score

值,以字元串形式表示。

key

的成員

member

score

值加上增量

increment

ZRANGE key start stop [WITHSCORES] 1.2.0 O(log(N)+M) 指定區間内,帶有

score

值(可選)的有序內建員的清單。
傳回有序集

key

中,指定區間内的成員。
ZREVRANGE key start stop [WITHSCORES] 1.2.0 O(log(N)+M) 指定區間内,帶有

score

值(可選)的有序內建員的清單。
傳回有序集

key

中,指定區間内的成員。 值按倒序 排列
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 1.0.5 O(log(N)+M) 指定區間内,帶有

score

值(可選)的有序內建員的清單。
傳回有序集

key

中,所有

score

值介于

min

max

之間(包括等于

min

max

)的成員。有序內建員按

score

值遞增(從小到大)次序排列。
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] 1.0.5 O(log(N)+M) 指定區間内,帶有

score

值(可選)的有序內建員的清單。
傳回有序集

key

中,所有

score

值介于

min

max

之間(包括等于

min

max

)的成員。有序內建員按

score

值遞增(從大到小)次序排列。
ZRANK key member 2.0.0 O(log(N)) 傳回

member

的排名
傳回有序集

key

中成員

member

的排名
ZREVRANK key member 2.0.0 O(log(N)) 傳回

member

的排名
傳回有序集

key

中成員

member

的排名(從大到小)
ZREM key member [member …] 1.2.0 O(M*log(N)) 被成功移除的成員的數量 移除有序集

key

中的一個或多個成員
ZREMRANGEBYRANK key start stop 2.0.0 O(log(N)+M) 被移除成員的數量 移除有序集

key

中,指定排名(rank)區間内的所有成員。
ZREMRANGEBYSCORE key min max 1.2.0 O(log(N)+M) 被移除成員的數量 移除有序集

key

中,所有

score

值介于

min

max

之間(包括等于

min

max

)的成員。
ZSCORE key member 1.2.0 O(1)

member

成員的

score

值,以字元串形式表示。
傳回有序集

key

中,成員

member

score

值。
ZUNIONSTORE 2.0.0 O(N)+O(M log(M)) 儲存到

destination

的結果集的基數。
ZINTERSTORE 2.0.0 O(N)+O(M log(M)) 儲存到

destination

的結果集的基數。

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) 接收到資訊

message

的訂閱者數量。
将資訊

message

發送到指定的頻道

channel

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) 總是傳回

OK

取消事務,放棄執行事務塊内的所有指令。
EXEC 1.2.0 * 事務塊内所有指令的傳回值,按指令執行的先後順序排列。 執行所有事務塊内的指令。
MULTI 1.2.0 O(1) 總是傳回

OK

标記一個事務塊的開始。
UNWATCH 2.2.0 O(1) 總是

OK

取消 WATCH 指令對所有 key 的監視。
WATCH key [key …] 2.2.0 O(1) 總是

OK

監視一個(或多個) 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) 密碼比對時傳回

OK

,否則傳回一個錯誤。
ECHO message 1.0.0 O(1)

message

自身。
列印一個特定的資訊

message

,測試時使用。
PING 1.0.0 O(1) 如果連接配接正常就傳回一個

PONG

,否則傳回一個連接配接錯誤。
使用用戶端向 Redis 伺服器發送一個

PING

,如果伺服器運作正常的話,會傳回一個

PONG

QUIT 1.0.0 O(1) 傳回

OK

退出
SELECT index 1.0.0 O(1) 傳回

OK

切換到指定的資料庫

伺服器操作指令

指令 可用版本 時間複雜度 傳回值 說明
BGREWRITEAOF 1.0.0 O(N) 回報資訊 執行一個 AOF檔案 重寫操作。重寫會建立一個目前 AOF 檔案的體積優化版本
BGSAVE 1.0.0 O(N) 回報資訊 在背景異步(Asynchronously)儲存目前資料庫的資料到磁盤。
CLIENT SETNAME connection-name 2.6.9 O(1) 設定成功時傳回

OK

為目前連接配接配置設定一個名字。
CLIENT GETNAME 2.6.9 O(1) 如果連接配接沒有設定名字,那麼傳回空白回複;如果有設定名字,那麼傳回名字。 傳回 CLIENT SETNAME 指令為連接配接設定的名字
CLIENT KILL ip:port 2.4.0 O(N) 當指定的用戶端存在,且被成功關閉時,傳回

OK

關閉位址為

ip:port

的用戶端。
CLIENT LIST 2.4.0 O(N) 以人類可讀的格式,傳回所有連接配接到伺服器的用戶端資訊和統計資料。
CONFIG SET parameter value 2.0.0 當設定成功時傳回

OK

,否則傳回一個錯誤。
動态地調整 Redis 伺服器的配置(configuration)而無須重新開機
CONFIG GET parameter 2.0.0 給定配置參數的值。 取得運作中的 Redis 伺服器的配置參數
CONFIG RESETSTAT 2.0.0 O(1) 總是傳回

OK

重置 INFO 指令中的某些統計資料
CONFIG REWRITE 2.8.0 如果配置重寫成功則傳回

OK

,失敗則傳回一個錯誤。
啟動 Redis 伺服器時所指定的

redis.conf

檔案進行改寫
DBSIZE 1.0.0 O(1) 目前資料庫的 key 的數量。 傳回目前資料庫的 key 的數量。
DEBUG OBJECT key 1.0.0 O(1)

key

存在時,傳回有關資訊。當

key

不存在時,傳回一個錯誤。
一個調試指令,它不應被用戶端所使用。
DEBUG SEGFAULT 1.0.0 執行一個不合法的記憶體通路進而讓 Redis 崩潰,僅在開發時用于 BUG 模拟。
FLUSHALL 1.0.0 總是傳回

OK

清空整個 Redis 伺服器的資料(删除所有資料庫的所有 key )。
FLUSHDB 1.0.0 O(1) 總是傳回

OK

清空目前資料庫中的所有 key。
INFO [section] 1.0.0 O(1)
LASTSAVE 1.0.0 O(1) 一個 UNIX 時間戳。 傳回最近一次 Redis 成功将資料儲存到磁盤上的時間,以 UNIX 時間戳格式表示。
MONITOR 1.0.0 總是傳回

OK

實時列印出 Redis 伺服器接收到的指令,調試用。
PSYNC <MASTER_RUN_ID> 2.8.0 用于複制功能(replication)的内部指令。
SYNC 1.0.0 ? 用于複制功能(replication)的内部指令。
SAVE 1.0.0 O(N) 儲存成功時傳回

OK

執行一個同步儲存操作
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

    : 以秒計算的空閑時長
  • flags

    : 用戶端 flag (見下文)
  • db

    : 該用戶端正在使用的資料庫 ID
  • sub

    : 已訂閱頻道的數量
  • psub

    : 已訂閱模式的數量
  • multi

    : 在事務中被執行的指令數量
  • qbuf

    : 查詢緩存的長度( 表示沒有查詢在等待)
  • qbuf-free

    : 查詢緩存的剩餘空間( 表示沒有剩餘空間)
  • obl

    : 輸出緩存的長度
  • oll

    : 輸出清單的長度(當輸出緩存沒有剩餘空間時,回複被入隊到這個隊列裡)
  • omem

    : 輸出緩存的記憶體占用量
  • events

    : 檔案描述符事件(見下文)
  • cmd

    : 最近一次執行的指令

用戶端 flag 可以由以下部分組成:

  • O

    : 用戶端是 MONITOR 模式下的附屬節點(slave)
  • S

    : 用戶端是一般模式下(normal)的附屬節點
  • M

    : 用戶端是主節點(master)
  • x

    : 用戶端正在執行事務
  • b

    : 用戶端正在等待阻塞事件
  • i

    : 用戶端正在等待 VM I/O 操作(已廢棄)
  • d

    : 一個受監視(watched)的鍵已被修改,

    EXEC

    指令将失敗
  • c

    : 在将回複完整地寫出之後,關閉連結
  • u

    : 用戶端未被阻塞(unblocked)
  • A

    : 盡可能快地關閉連接配接
  • N

    : 未設定任何 flag

檔案描述符事件可以是:

  • r

    : 用戶端套接字(在事件 loop 中)是可讀的(readable)
  • w

    : 用戶端套接字(在事件 loop 中)是可寫的(writeable)

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

,可以讓指令隻傳回某一部分的資訊:

  • server

    : 一般 Redis 伺服器資訊,包含以下域:
    • redis_version

      : Redis 伺服器版本
    • redis_git_sha1

      : Git SHA1
    • redis_git_dirty

      : Git dirty flag
    • os

      : Redis 伺服器的宿主作業系統
    • arch_bits

      : 架構(32 或 64 位)
    • multiplexing_api

      : Redis 所使用的事件處理機制
    • gcc_version

      : 編譯 Redis 時所使用的 GCC 版本
    • process_id

      : 伺服器程序的 PID
    • run_id

      : Redis 伺服器的随機辨別符(用于 Sentinel 和叢集)
    • tcp_port

      : TCP/IP 監聽端口
    • uptime_in_seconds

      : 自 Redis 伺服器啟動以來,經過的秒數
    • uptime_in_days

      : 自 Redis 伺服器啟動以來,經過的天數
    • lru_clock

      : 以分鐘為機關進行自增的時鐘,用于 LRU 管理
  • clients

    : 已連接配接用戶端資訊,包含以下域:
    • connected_clients

      : 已連接配接用戶端的數量(不包括通過從屬伺服器連接配接的用戶端)
    • client_longest_output_list

      : 目前連接配接的用戶端當中,最長的輸出清單
    • client_longest_input_buf

      : 目前連接配接的用戶端當中,最大輸入緩存
    • blocked_clients

      : 正在等待阻塞指令(BLPOP、BRPOP、BRPOPLPUSH)的用戶端的數量
  • memory

    : 記憶體資訊,包含以下域:
    • used_memory

      : 由 Redis 配置設定器配置設定的記憶體總量,以位元組(byte)為機關
    • used_memory_human

      : 以人類可讀的格式傳回 Redis 配置設定的記憶體總量
    • used_memory_rss

      : 從作業系統的角度,傳回 Redis 已配置設定的記憶體總量(俗稱常駐集大小)。這個值和

      top

      ps

      等指令的輸出一緻。
    • used_memory_peak

      : Redis 的記憶體消耗峰值(以位元組為機關)
    • used_memory_peak_human

      : 以人類可讀的格式傳回 Redis 的記憶體消耗峰值
    • used_memory_lua

      : Lua 引擎所使用的記憶體大小(以位元組為機關)
    • mem_fragmentation_ratio

      :

      used_memory_rss

      used_memory

      之間的比率
    • mem_allocator

      : 在編譯時指定的, Redis 所使用的記憶體配置設定器。可以是 libc 、 jemalloc 或者 tcmalloc 。
    在理想情況下,

    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 計算量統計資訊
  • commandstats

    : Redis 指令統計資訊
  • cluster

    : Redis 叢集資訊
  • keyspace

    : 資料庫相關的統計資訊

除上面給出的這些值以外,參數還可以是下面這兩個:

  • all

    : 傳回所有資訊
  • default

    : 傳回預設選擇的資訊

當不帶參數直接調用 INFO 指令時,使用

default

作為預設參數。

SHUTDOWN

SHUTDOWN 指令執行以下操作:

  • 停止所有用戶端
  • 如果有至少一個儲存點在等待,執行 SAVE 指令
  • 如果 AOF 選項被打開,更新 AOF 檔案
  • 關閉 redis 伺服器(server)

如果持久化被打開的話, SHUTDOWN 指令會保證伺服器正常關閉而不丢失任何資料。

另一方面,假如隻是單純地執行 SAVE 指令,然後再執行 QUIT 指令,則沒有這一保證 —— 因為在執行 SAVE 之後、執行 QUIT 之前的這段時間中間,其他用戶端可能正在和伺服器進行通訊,這時如果執行 QUIT 就會造成資料丢失。

SAVE 和 NOSAVE 修飾符

通過使用可選的修飾符,可以修改 SHUTDOWN 指令的表現。比如說:

  • 執行

    SHUTDOWN SAVE

    會強制讓資料庫執行儲存操作,即使沒有設定(configure)儲存點
  • 執行

    SHUTDOWN NOSAVE

    會阻止資料庫執行儲存操作,即使已經設定有一個或多個儲存點(你可以将這一用法看作是強制停止伺服器的一個假想的 ABORT 指令)

Script(腳本)

繼續閱讀