Redis命令手冊

Redis命令手冊

字符串


SET

  • SET key value [EX seconds] [PX milliseconds] [NX|XX]
  • 將字符串值value關聯到key。
  • 如果key已經持有其他值,set就覆寫舊值,無視類型。
  • 當set命令對一個帶有生存時間(TTL)的鍵進行設置之後,該鍵原有的TTL將被清除
  • NX:只在鍵不存在時,才對鍵進行設置操作,等同於setnx。
  • XX:只在鍵已經存在時,才對鍵進行設置操作。

SETNX

  • SETNX key value
  • 只在鍵key不存在的情況下,將鍵key的值設置為value。
  • 若鍵key已經存在,則setnx命令不做任何動作。
  • setnx是set if not exist的簡寫。
  • 命令在設置成功時返回1,設置失敗時返回0。

SETEX

  • SETEX key seconds value
  • 將鍵key的值設置為value,並將鍵key的生存時間設置為seconds秒鐘。
  • 如果鍵key已經存在,那麼setex命令將覆蓋已有的值。
  • 等同於set key value, expire key seconds兩個命令的組合,不同的是setex是一個原子操作
  • 命令在設置成功時返回OK,當seconds參數不合法時,命令將返回一個錯誤。

PSETEX

  • PSETEX key milliseconds value
  • 這個命令和setex命令相似,但它以毫秒為單位設置key的過期時間。
  • 命令在設置成功時返回OK。

GET

  • GET key
  • 返回與鍵key相關聯的字符串值。
  • 如果key不存在,那麼返回特殊值nil;否則返回key的值。
  • 如果key的值並非字符串類型,那麼返回一個錯誤,因為get命令只能用於字符串值。

GETSET

  • GETSET key value
  • 將key的值設為value,並返回key在被設置之前的舊值。
  • 返回給定key的舊值。
  • 如果key沒有舊值,那麼返回nil。
  • 當key存在但不是字符串類型時,命令返回一個錯誤。

STRLEN

  • STRLEN key
  • 返回key儲存的字符串值的長度。
  • 當key不存在時,命令返回0。
  • 當key儲存的不是字符串值時,返回一個錯誤。

APPEND

  • APPEND key value
  • 如果key已經存在並且它的值是一個字符串,append命令將把value追加到key現有值的末尾。
  • 如果key不存在,append就簡單地將key的值設為value,等同於set key value命令。
  • 返回追加value之後,鍵key的值的長度。

SETRANGE

  • SETRANGE key offset value
  • 從偏移量offset開始,用value參數覆寫鍵key儲存的字符串值。
  • 不存在的鍵key當作空白字符串處理。
  • setrange命令會確保字符串足夠長以便將value設置到指定的偏移量上,如果鍵key原來儲存的字符串長度比偏移量小,那麼原字符和偏移量之間的空白將用零位元組(zerobytes,”\x00″)進行填充。
  • redis字符串大小最多512M,所以用戶能夠使用的最大偏移量為2^29-1。

GETRANGE

  • GETRANGE key start end
  • 返回鍵key儲存的字符串值的指定部分,字符串的截取範圍由start和end兩個偏移量決定,包括start和end在內。
  • 負數偏移量表示從字符串的末尾開始計數,-1表示最後一個字符,-2表示倒數第二個字符,以此類推。
  • getrange通過保證子字符串的值域不超過實際字符串的值域來處理超出範圍的值域請求。

INCR

  • INCR key
  • 為鍵key儲存的數字值加上一。
  • 如果鍵key不存在,那麼它的值會先被初始化為0,然後再執行INCR命令。
  • 如果鍵key儲存的值不能被解釋為數字,那麼INCR命令將返回一個錯誤。
  • 本操作的值限制在64位有符號數字表示之內。
  • INCR命令會返回鍵key在執行加一操作之後的值。

INCRBY

  • INCRBY key increment
  • 為鍵key儲存的數字值加上增量increment。
  • 如果鍵key不存在,那麼鍵key的值會先被初始化為0,然後再執行INCRBY命令。
  • 如果鍵key儲存的值不能被解釋為數字,那麼INCRBY命令將返回一個錯誤。
  • 本操作的值限制在64位有符號數字表示之內。
  • 返回加上增量increment之後,鍵key當前的值。

INCRBYFLOAT

  • INCRBYFLOAT key increment
  • 為鍵key儲存的值加上浮點數增量increment。
  • 如果鍵key不存在,那麼INCRBYFLOAT會先將鍵key的值設為0,然後再執行加法操作。
  • 如果命令執行成功,那麼鍵key的值會被更新為執行加法計算之後的新值,並且新值會以字符串的形式返回給調用者。
  • 無論加法計算所得的浮點數的實際精度有多長,INCRBYFLOAT命令的計算結果最多只保留小數點的後十七位。
  • 當以下任意一個條件發生時,命令返回一個錯誤:
    • 鍵key的值不是字符串類型。
    • 鍵key當前的值或者給定的增量increment不能被解釋為雙精度浮點數。

DECR

  • DECR key
  • 為鍵key儲存的數字值減去一。
  • 如果鍵key不存在,那麼鍵key的值會先被初始化為0,然後再執行DECR操作。
  • 如果鍵key儲存的值不能被解釋為數字,那麼DECR命令將返回一個錯誤。
  • 本操作的值限制在64位有符號數字表示之內。
  • DECR命令會返回鍵key在執行減一操作之後的值。

DECRBY

  • DECRBY key decrement
  • 將鍵key儲存的整數值減去減量decrement。
  • 如果鍵key不存在,那麼鍵key的值會先被初始化為0,然後再執行DECRBY命令。
  • 如果鍵key儲存的值不能被解釋為數字,那麼DECRBY命令將返回一個錯誤。
  • 本操作的值限制在64位有符號數字表示之內。
  • DECRBY命令會返回鍵在執行減法操作之後的值。

MSET

  • MSET key value [key value …]
  • 同時為多個鍵設置值。
  • 如果某個給定鍵已經存在,那麼MSET將使用新值去覆蓋舊值,如果這不是你所希望的效果,請考慮使用MSETNX。
  • MSET是一個原子性操作,所有給定鍵都會在同一時間內被設置,不會出現某些鍵被設置了但是另一些鍵沒有被設置的情況。
  • MSET命令總是返回OK。

MSETNX

  • MSETNX key value [key value …]
  • 當且僅當所有給定鍵都不存在時,為所有給定鍵設置值。
  • 即使只有一個給定鍵已經存在,MSETNX命令也會拒絕執行對所有鍵的設置操作。
  • MSETNX是一個原子性操作,所有給定鍵要麼全部都被設置,要麼就全部都不設置,不可能出現第三種狀態。
  • 當所有給定鍵都設置成功時,命令返回1;否則返回0。

MGET

  • MGET key [key …]
  • 返回給定的一個或多個字符串鍵的值。
  • 如果給定的字符串鍵裏面,有某個鍵不存在,那麼這個鍵的值將以特殊值nil表示。
  • MGET命令將返回一個列表,列表中包括了所有給定鍵的值。

哈希表


HSET

  • HSET hash field value
  • 將哈希表hash中域field的值設置為value。
  • 如果給定的哈希表並不存在,那麼一個新的哈希表將被創建並執行HSET操作。
  • 如果域field已經存在於哈希表中,那麼它的舊值將被新值value覆蓋。
  • 當HSET命令在哈希表中新創建field域並成功為它設置值時,命令返回1;如果域field已經存在於哈希表,並且HSET命令成功使用新值覆蓋了它的舊值,那麼命令返回0。

HSETNX

  • HSETNX hash field value
  • 當且僅當域field尚未存在於哈希表的情況下,將它的值設置為value。
  • 如果給定域已經存在於哈希表當中,那麼命令將放棄執行設置操作。
  • 如果哈希表hash不存在,那麼一個新的哈希表將被創建並執行HSETNX命令。
  • HSETNX命令在設置成功時返回1,在給定域已經存在而放棄執行設置操作時返回0。

HGET

  • HGET hash field
  • 返回哈希表中給定域的值。
  • 如果給定域不存在域哈希表中,又或者給定的哈希表並不存在,那麼命令返回nil。

HEXISTS

  • HEXISTS hash field
  • 檢查給定域field是否存在於哈希表hash當中。
  • HEXISTS命令在給定域存在時返回1,在給定域不存在時返回0。

HDEL

  • HDEL key field [field …]
  • 刪除哈希表key中的一個或多個指定域,不存在的域將被忽略。
  • 返回被成功移除的域的數量,不包括被忽略的域。

HLEN

  • HLEN key
  • 返回哈希表key中域的數量。
  • 當key不存在時,返回0。

HSTRLEN

  • HSTRLEN key field
  • 返回哈希表key中,與給定域field相關聯的值的字符串長度。
  • 如果給定的鍵或者域不存在,那麼命令返回0。

HINCRBY

  • HINCRBY key field increment
  • 為哈希表key中的域field的值加上增量increment。
  • 增量也可以為負數,相當於給給定域進行減法操作。
  • 如果key不存在,一個新的哈希表被創建並執行HINCRBY命令。
  • 如果field不存在,那麼在執行命令前,域的值被初始化為0。
  • 對一個儲存字符串值的域field執行HINCRBY命令將造成一個錯誤。
  • 本操作的值被限制在64位有符號數字表示之內。
  • 返回執行HINCRBY命令之後,哈希表key中域field的值。

HINCRBYFLOAT

  • HINCRBYFLOAT key field increment
  • 為哈希表key中的域field加上浮點數增量increment。
  • 如果哈希表中沒有域field,那麼HINCRBYFLOAT會先將域field的值設為0,然後再執行加法操作。
  • 如果鍵key不存在,那麼HINCRBYFLOAT會先創建一個哈希表,再創建域field,最後再執行加法操作。
  • 當以下任意一個條件發生時,返回一個錯誤:
    • 域field的值不是字符串類型。
    • 域field當前的值或給定的增量increment不能解釋為雙精度浮點數。
  • 返回執行加法操作之後field域的值。

HMSET

  • HMSET key field value [field value …]
  • 同時將多個field-value對設置到哈希表key中。
  • 此命令會覆蓋哈希表中已存在的域。
  • 如果key不存在,一個空哈希表被創建並執行HMSET操作。
  • 如果命令執行成功,返回OK。
  • 當key不是哈希表類型時,返回一個錯誤。

HMGET

  • HMGET key field [field …]
  • 返回哈希表key中,一個或多個給定域的值。
  • 如果給定的域不存在於哈希表,那麼返回一個nil值。
  • 因為不存在的key被當作一個空哈希表來處理,所以對一個不存在的key進行HMGET操作將返回一個只帶有nil的表。
  • 返回一個包含多個給定域的關聯值的表,表值的排列順序和給定域參數的請求順序一樣。

HKEYS

  • HKEYS key
  • 返回哈希表key中的所有域field的表。
  • 當key不存在時,返回一個空表。

HVALS

  • HVALS key
  • 返回哈希表key中所有值的表。
  • 當key不存在時,返回一個空表。

HGETALL

  • HGETALL key
  • 返回哈希表key中,所有的域和值的表。
  • 在返回值里,緊跟每個域名field之後是域的值value,所以返回值的長度是哈希表大小的兩倍。
  • 若key不存在,返回空列表。

列表


LPUSH

  • LPUSH key value [value …]
  • 將一個或多個值value插入到列表key的表頭
  • 如果有多個value值,那麼各個value值按從左到右的順序依次插入到表頭。
  • 如果key不存在,一個空列表會被創建並執行LPUSH操作。
  • 當key存在但不是列表類型時,返回一個錯誤。
  • 返回執行LPUSH命令後,列表的長度。

LPUSHX

  • LPUSHX key value
  • 將值value插入到列表key的表頭,當且僅當key存在並且是一個列表。
  • 當key不存在時,LPUSHX命令什麼也不做。
  • 返回LPUSHX命令執行之後,表的長度。

RPUSH

  • RPUSH key value [value …]
  • 將一個或多個值value插入到列表key的表尾。
  • 如果有多個value值,那麼各個value值按從左到右的順序依次插入到表尾。
  • 如果key不存在,一個空列表會被創建並執行RPUSH操作。
  • 當key存在但不是列表類型時,返回一個錯誤。
  • 返回執行RPUSH操作後,表的長度。

RPUSHX

  • RPUSHX key value
  • 將值value插入到列表key的表尾,當且僅當key存在並且是一個列表。
  • 當key不存在時,RPUSHX命令什麼都不做。
  • 返回RPUSHX命令執行之後,表的長度。

LPOP

  • LPOP key
  • 移除並返回列表key的頭元素。
  • 當key不存在時,返回nil。

RPOP

  • RPOP key
  • 移除並返回列表key的尾元素。
  • 當key不存在時,返回nil。

RPOPLPUSH

  • RPOPLPUSH source destination
  • 命令RPOPLPUSH在一個原子時間內,執行以下兩個動作:
    • 將列表source中的尾元素彈出,並返回給客戶端。
    • 將source彈出的元素插入到列表destination,作為destination列表的頭元素。
  • 如果source不存在,值nil被返回,並且不執行其他動作。
  • 如果source和destination相同,則列表中的表尾元素被移動到表頭,並返回該元素,可以把這種特殊情況視作列表的旋轉操作。

LREM

  • LREM key count value
  • 根據參數count的值,移除列表中與參數value相等的元素。
  • count的值可以是以下幾種:
    • count > 0:從表頭開始向表尾搜索,移除與value相等的元素,數量為count。
    • count < 0:從表尾開始向表頭搜索,移除與value相等的元素,數量為count的絕對值。
    • count = 0:移除表中所有與value相等的值。
  • 返回被移除元素的數量,因為不存在的key被視作空表,所以當key不存在時,LREM命令總是返回0。

LLEN

  • LLEN key
  • 返回列表key的長度。
  • 如果key不存在,則key被解釋為一個空列表,返回0。
  • 如果key不是列表類型,返回一個錯誤。

LINDEX

  • LINDEX key index
  • 返回列表key中,下標為index的元素。
  • 下標index參數start和stop都以0為底,也就是說,以0表示列表的第一個元素,以1表示列表的第二個元素,以此類推。
  • 下標-1表示列表的最後一個元素,-2表示列表的倒數第二個元素,以此類推。
  • 如果key不是列表類型,返回一個錯誤。
  • 如果index參數的值不在列表的區間範圍內,返回nil。

LINSERT

  • LINSERT key BEFORE|AFTER pivot value
  • 將值value插入到列表key當中,位於值pivot之前或之後。
  • 當pivot不存在於列表key時,不執行任何操作。
  • 當key不存在時,key被視為空列表,不執行任何操作。
  • 如果key不是列表類型,返回一個錯誤。
  • 如果命令執行成功,返回插入操作完成之後,列表的長度。如果沒有找到pivot,返回-1。如果key不存在或為空列表,返回0。

LSET

  • LSET key index value
  • 將列表key下標為index的元素設置為value。
  • 當index參數超出範圍時,或對一個空列表進行LSET時,返回一個錯誤。
  • 操作成功返回ok,否則返回錯誤信息。

LRANGE

  • LRANGE key start stop
  • 返回列表key中指定區間內的元素,區間以偏移量start和stop指定。
  • 下標index參數start和stop都以0為底,也就是說,以0表示列表的第一個元素,以1表示列表的第二個元素,以此類推。
  • 也可以使用負數下標,以-1表示列表的最後一個元素,-2表示列表的倒數第二個元素,以此類推。
  • start和stop下標都包含在內,是一個閉區間。
  • 超出範圍的下標值不會引起錯誤。
    • 如果start下標比列表的最大下標end還要大,那麼LRANGE返回一個空列表。
    • 如果stop下標比end下標還要大,Redis將stop的值設置為end。

LTRIM

  • LTRIM key start stop
  • 對一個列表進行修剪,就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
  • start和stop下標都被包含在內,閉區間。
  • 當key不是列表類型時,返回一個錯誤。
  • 下標index參數start和stop都以0為底,也就是說,以0表示列表的第一個元素,以1表示列表的第二個元素,以此類推。
  • 也可以使用負數下標,以-1表示列表的最後一個元素,-2表示列表的倒數第二個元素,以此類推。
  • start和stop下標都包含在內,是一個閉區間。
  • 超出範圍的下標值不會引起錯誤。
    • 如果start下標比列表的最大下標end還要大,那麼LRANGE返回一個空列表。
    • 如果stop下標比end下標還要大,Redis將stop的值設置為end。
  • 命令執行成功時,返回ok。

BLPOP

  • BLPOP key [key …] timeout
  • BLPOP是列表的阻塞式彈出原語。
  • 它式LPOP key命令的阻塞版本,當給定列表內沒有任何元素可供彈出的時候,連接將被BLPOP命令阻塞,直到等待超時或發現可彈出元素為止。
  • 當給定多個key參數時,按參數key的先後順序依次檢查各個列表,彈出第一個非空列表的頭元素。
  • 非阻塞行為
    • 當BLPOP被調用時,如果給定key內至少有一個非空列表,那麼彈出遇到的第一個非空列表的頭元素,並和被彈出元素所屬的列表的名字一起,組成結果返回給調用者([key, result]。
    • 當存在多個給定key時,BLPOP按給定key參數排列的先後順序,依次檢查各個列表。
  • 阻塞行為
    • 如果所有給定key都不存在或包含空列表,那麼BLPOP命令將阻塞連接,直到等待超時,或有另一個客戶端對給定key的任意一個執行LPUSH或RPUSH命令為止。
    • 超時參數timeout接受一個以秒為單位的數字作為值。超時參數設為0表示阻塞時間可以無限期延長。
  • 相同key被多個客戶端同時阻塞
    • 相同key可以被多個客戶端同時阻塞。
    • 不同的客戶端被放進一個隊列中,按先阻塞先服務的順序為key執行BLPOP命令。
  • 在MULTI/EXEC事務中的BLPOP
    • BLPOP可以用於流水線pipeline,但把它用在MULTI/EXEC塊當中沒有意義。因為這要求整個服務器被阻塞以保證塊執行時的原子性,該行為阻止了其他客戶端執行LPUSH或RPUSH命令。
    • 因此,一個被包裹在MULTI/EXEX塊內的BLPOP命令,行為表現得就像LPOP key一樣,對空列表返回nil,對非空列表彈出列表元素,不進行任何阻塞操作。
  • 返回值
    • 如果列表為空,返回一個nil。否則,返回一個含有兩個元素的列表,第一個元素時被彈出元素所屬的key,第二個元素是被彈出元素的值。

BRPOP

  • BRPOP key [key …] timeout
  • BRPOP是列表的阻塞式彈出原語。
  • 用法同BLPOP,不過彈出的是尾元素。

BRPOPLPUSH

  • BRPOPLPUSH source destination timeout
  • BRPOPLPUSH是RPOPLPUSH的阻塞版本,當給定列表source不為空時, BRPOPLPUSH的表現和RPOPLPUSH一樣。
  • 當列表source為空時,BRPOPLPUSH命令將阻塞連接,直到等待超時,或有另一個客戶端對source執行LPUSH或RPUSH命令為止。
  • 超時參數timeout接受一個以秒為單位的數字作為值。超時參數設為0表示阻塞時間可以無限期延長。
  • 假如在指定時間內沒有任何元素被彈出,則返回一個nil和等待時長。反之,返回一個含有兩個元素的列表,第一個元素是被彈出元素的值,第二個元素是等待時長。

集合


SADD

  • SADD key member [member …]
  • 將一個或多個member元素加入到集合key當中,已經存在於集合的member元素將被忽略。
  • 假如key不存在,則創建一個只包含member元素作成員的集合。
  • 當key不是集合類型時,返回一個錯誤。
  • 返回被添加到集合中的新元素的數量,不包括被忽略的元素。

SISMEMBER

  • SISMEMBER key member
  • 判斷member元素是否集合key的成員。
  • 如果member元素是集合的成員,返回1。如果member元素不是集合的成員,或key不存在,返回0。

SPOP

  • SPOP key
  • 移除並返回集合中的一個隨機元素。
  • 如果只想獲取一個隨機元素,但不想該元素從集合中被移除的話,可以使用SRANDMEMBER key [count]命令。
  • 當key不存在或key是空集時,返回nil。

SRANDMEMBER

  • SRANDMEMBER key [count]
  • 如果命令執行時,只提供了key參數,那麼返回集合中的一個隨機元素。
  • 從Redis2.6版本開始,SRANDMEMBER命令接受可選的count參數:
    • 如果count為正數,且小於集合基數,那麼命令返回一個包含count個元素的數組,數組中的元素各不相同。如果count大於等於集合基數,那麼返回整個集合。
    • 如果count為負數,那麼命令返回一個數組,數組中的元素可能會重複出現多次,而數組的長度為count的絕對值。
  • 該操作和SPOP key相似,但SPOP key將隨機元素從集合中移除並返回,而SRANDMEMBER則僅僅返回隨機元素,而不對集合進行任何改動。
  • 只提供key參數時,返回一個元素;如果集合為空,返回nil。如果提供了count參數,那麼返回一個數組;如果集合為空,返回空數組。

SREM

  • SREM key member [member …]
  • 移除集合key中的一個或多個member元素,不存在的member元素會被忽略。
  • 當key不是集合類型時,返回一個錯誤。
  • 返回被成功移除的元素的數量,不包括被忽略的元素。

SMOVE

  • SMOVE source destination member
  • 將member元素從source集合移動到destination集合。
  • SMOVE是原子性操作。
  • 如果source集合不存在或不包含指定的member元素,則SMOVE命令不執行任何操作,僅返回0。否則,member元素從source集合中被移除,並添加到destination集合中去。
  • 當destination集合已經包含member元素時,SMOVE命令只是簡單地將source集合中的member元素刪除。
  • 當source或destination不是集合類型時,返回一個錯誤。
  • 如果member元素被成功移除,返回1。如果member元素不是source集合的成員,並且沒有任何操作對destination集合執行,那麼返回0。

SCARD

  • SCARD key
  • 返回集合key的基數(集合中元素的數量)。
  • 當key不存在時,返回0。

SMEMBERS

  • SMEMBERS key
  • 返回集合key中的所有成員。
  • 不存在的key被視為空集合。

SINTER

  • SINTER key [key …]
  • 返回一個集合的全部成員,該集合是所有給定集合的交集。
  • 不存在的key被視為空集。
  • 當給定集合當中有一個空集時,結果也為空集。

SINTERSTORE

  • SINTERSTORE destination key [key …]
  • 這個命令類似於SINTER key [key …]命令,但它將結果保存到destination集合,而不是簡單地返回結果集。
  • 如果destination集合已經存在,則將其覆蓋。
  • destination可以是key本身。
  • 返回結果集中的成員數量。

SUNION

  • SUNION key [key …]
  • 返回所有給定集合的並集。
  • 不存在的key被視為空集。

SUNIONSTORE

  • SUNIONSTORE destination key [key …]
  • 這個命令類似於SUNION,但它將結果保存到destination集合,而不是簡單地返回結果集。
  • 如果destination已經存在,則將其覆蓋。
  • destination可以是key本身。
  • 返回集中的元素數量。

SDIFF

  • SDIFF key [key …]
  • 返回所有給定集合之間的差集。
  • 不存在的key被視為空集。

SDIFFSTORE

  • SDIFFSTORE destination key [key …]
  • 這個命令的作用和SDIFF類似,但它將結果保存到destination集合,而不是簡單地返回結果集。
  • 如果destination集合已經存在,則將其覆蓋。
  • destination可以是key本身。
  • 返回結果集中的元素數量。

有序集合


ZADD

  • ZADD key score member [[score member] [score member] …]
  • 將一個或多個member元素及其score值加入到有序集key當中。
  • 如果某個member已經是有序集的成員,那麼更新這個member的score值,並通過重新插入這個member元素,來保證該member在正確的位置上。
  • score值可以是整數值或雙精度浮點數。
  • 如果key不存在,則創建一個空的有序集並執行ZADD操作。
  • 當key存在但不是有序集類型時,返回一個錯誤。
  • 返回被成功添加的新成員的數量,不包括那些被更新的、已經存在的成員。

ZSCORE

  • ZSCORE key member
  • 返回有序集key中,成員member的score值,以字符串形式表示。
  • 如果member元素不是有序集key的成員,或key不存在,返回nil。

ZINCRBY

  • ZINCRBY key increment member
  • 為有序集key的成員member的score值加上增量increment。
  • 可以通過傳遞一個負數值increment,讓score減去相應的值。
  • 當key不存在,或member不是key的成員時,ZINCRBY key increment member等同於ZADD key increment member。
  • 當key不是有序集類型時,返回一個錯誤。
  • score值可以是整數值或雙精度浮點數。
  • 返回member成員的新score值,以字符串形式表示。

ZCARD

  • ZCARD key
  • 當key存在且是有序集類型時,返回有序集的基數。當key不存在時,返回0。

ZCOUNT

  • ZCOUNT key min max
  • 返回有序集key中,score值在min和max之間(默認包括等於)的成員的數量。

ZRANGE

  • ZRANGE key start stop [WITHSCORES]
  • 返回有序集key中,指定區間內的成員。
  • 其中成員的位置按score值遞增來排序。
  • 具有相同score值的成員按字典序來排列。
  • 如果需要成員按score值遞減來排列,請使用ZREVRANGE key start stop [WITHSCORES]命令。
  • 下標參數start和stop都以0為底,也就是說,以0表示有序集第一個成員,以1表示有序集第二個成員,以此類推。你也可以使用負數下標,以-1表示最後一個成員,-2表示倒數第二個成員,以此類推。
  • 超出範圍的下標並不會引起錯誤。比如說,當start的值比有序集的最大下標還要大,或是start>stop時,ZRANGE命令只是簡單地返回一個空列表。另一方面,假如stop參數的值比有序集的最大下標還要大,那麼Redis將stop當作最大下標來處理。
  • 可以通過使用WITHSCORES選項,來讓成員和它的score值一併返回,返回列表以value1、socre1、value2、score2…的格式表示。客戶端庫可能會返回一些更複雜的數據類型,比如數組、元組等。
  • 返回指定區間內,帶有score值(可選)的有序集成員的列表。

ZREVRANGE

  • ZREVRANGE key start stop [WITHSCORES]
  • 除了成員按score值遞減的次序排列這一點外,ZREVRANGE命令的其他方面和ZRANGE命令一樣。

ZRANGEBYSCORE

  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
  • 返回有序集key中,所有score值介於min和max之間(包括等於min或max)的成員。有序集成員按score值遞增次序排列。
  • 具有相同score值的成員按字典序來排列(該屬性是有序集提供的,不需要額外的計算)。
  • 可選的LIMIT參數指定返回結果的數量及區間,注意當offset很大時,定位offset的操作可能需要遍歷整個有序集,此過程最壞複雜度為O(N)時間。
  • 可選的WITHSCORES參數決定結果集是單單返回有序集的成員,還是將有序集成員及其socre值一起返回。
  • 區間及無限
    • min和max可以是-inf和+inf,這樣一來,你就可以在不知道有序集的最低和最高score值的情況下,使用ZRANGEBYSCORE這類命令。
    • 默認情況下,區間的取值使用閉區間(小於等於或大於等於),你也可以通過給參數前增加(符號來使用可選的開區間(小於或大於)。
  • 返回指定區間內,帶有score值(可選)的有序集成員的列表。

ZREVRANGEBYSCORE

  • ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
  • 除了成員按score值遞減的次序排列這一點外,ZREVRANGEBYSCORE命令的其他方面和ZRANGEBYSCORE命令一樣。

ZRANK

  • ZRANK key member
  • 返回有序集key中成員member的排名。其中有序集成員按score值遞增順序排列。
  • 排名以0為底,也就是說,score值最小的成員排名為0。
  • 使用ZREVRANK命令可以獲得成員按score值遞減排列的排名。
  • 如果member是有序集key的成員,返回member的排名。如果member不是有序集key的成員,返回nil。

ZREVRANK

  • ZREVRANK key member
  • 返回有序集key中成員member的排名。其中有序集成員按score值遞減順序排列。
  • 排名以0為底,也就是說,score值最大的成員排名為0。
  • 使用ZRANK命令可以獲得成員按score值遞增排列的排名。
  • 如果member是有序集key的成員,返回member的排名。如果member不是有序集key的成員,返回nil。

ZREM

  • ZREM key member [member …]
  • 移除有序集key中的一個或多個成員,不存在的成員將被忽略。
  • 當key存在但不是有序集類型時,返回一個錯誤。
  • 返回被成功移除的成員的數量,不包括被忽略的成員。

ZREMRANGEBYRANK

  • ZREMRANGEBYRANK key start stop
  • 移除有序集key中,指定排名區間內的所有成員。
  • 區間分別以下標參數start和stop指出,包含start和stop在內。
  • 下標參數start和stop都以0為底,也就是說,以0表示有序集第一個成員,以1表示有序集第二個成員,以此類推。你也可以使用負數下標,以-1表示最後一個成員,-2表示倒數第二個成員,以此類推。
  • 返回被移除成員的數量。

ZREMRANGEBYSCORE

  • ZREMRANGEBYSCORE key min max
  • 移除有序集key中,所有score值介於min和max之間(包括等於min或max)的成員。
  • score值等於min或max的成員也可以不包括在內,同ZRANGEBYSCORE命令。
  • 返回被移除成員的數量。

ZRANGEBYLEX

  • ZRANGEBYLEX key min max [LIMIT offset count]
  • 當有序集合的所有成員都具有相同的分值時,有序集合的元素會根據成員的字典序來進行排序,而這個命令則可以返回給定的有序集合鍵key中,值介於min和max之間的成員。
  • 如果有序集合裏面的成員帶有不同的分值,那麼命令返回的結果是未指定的。
  • 命令會使用C語言的memcmp()函數,對集合中的每個成員進行逐個位元組的對比,並按照從低到高的順序,返回排序後的集合成員。如果兩個字符串有一部分內容是相同的話,那麼命令會認為較長的字符串比較短的字符串要大。
  • 可選的LIMIT offset count參數用於獲取指定範圍內的匹配元素。如果offset參數的值非常大的話,那麼命令在返回結果之前,需要先遍歷至offset所指定的位置,這個操作會為命令加上最多O(N)複雜度。
  • 合法的min和max參數必須包含(或者[,其中(表示開區間,而[則表示閉區間。
  • 特殊值+和-在min參數以及max參數中具有特殊的意義,其中+表示正無限,而-表示負無限。因此,向一個所有成員的分值都相同的有序集合發送命令ZRANGEBYLEX <zset> - +,命令將返回有序集合中的所有元素。
  • 返回一個列表,包含了有序集合在指定範圍內的成員。

ZLEXCOUNT

  • ZLEXCOUNT key min max
  • 對於一個所有成員的分值都相同的有序集合鍵key來說,這個命令會返回該集合中,成員介於min和max範圍內的元素數量。
  • 這個命令的min參數和max參數的意義和ZRANGEBYLEX命令一樣。
  • 返回指定範圍內的元素數量。

ZREMRANGEBYLEX

  • ZREMRANGEBYLEX key min max
  • 對於一個所有成員的分值都相同的有序集合鍵key來說,這個命令會移除該集合中,成員介於min和max範圍內的所有元素。
  • 這個命令的min參數和max參數的意義和ZRANGEBYLEX命令一樣。
  • 返回被移除的元素數量。

ZUNIONSTORE

  • ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]
  • 計算給定的一個或多個有序集的並集,其中給定key的數量必須以numkeys參數指定,並將該並集儲存到destination。
  • 默認情況下,結果集中某個成員的score值是所有給定集下該成員score值之和。
  • WEIGHTS
    • 使用WEIGHTS選項,你可以為每個給定有序集分別指定一個乘法因子,每個給定有序集的所有成員的score值在傳遞給集合函數之前都要先乘以該有序集的因子。
    • 如果沒有指定WEIGHTS選項,乘法因子默認設置為1。
  • AGGREGATE
    • 使用AGGREGATE選項,你可以指定並集的結果集的聚合方式。
    • 默認使用的參數SUM,為加法;使用MIN,用最小的那個值;使用MAX,用最大的那個值。
  • 返回保存到destination結果集的基數。

ZINTERSTORE

  • ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]
  • 計算給定的一個或多個有序集的交集,其中給定key的數量必須以numkeys參數指定,並將該交集儲存到destination。
  • 可選參數同ZUNIONSTORE
  • 返回保存到destination結果集的基數。

數據庫


EXISTS

  • EXISTS key
  • 檢查給定key是否存在,若key存在,返回1,否則返回0。

TYPE

  • TYPE key
  • 返回key所儲存的值的類型:
    • none(key不存在)
    • string(字符串)
    • list(列表)
    • set(集合)
    • zset(有序集)
    • hash(哈希表)
    • stream(流)

RENAME

  • RENAME key newkey
  • 將key改名為newkey。
  • 當key和newkey相同,或者key不存在時,返回一個錯誤。
  • 當newkey已經存在時,RENAME命令將覆蓋舊值。
  • 改名成功時提示OK,失敗時候返回一個錯誤。

RENAMENX

  • RENAMENX key newkey
  • 當且僅當newkey不存在時,將key改名為newkey。
  • 當key不存在時,返回一個錯誤。
  • 修改成功時,返回1;如果newkey已經存在,返回0。

MOVE

  • MOVE key db
  • 將當前數據庫的key移動到給定的數據庫db當中。
  • 如果當前數據庫和給定數據庫有相同名字的給定key,或者key不存在於當前數據庫,那麼MOVE沒有任何效果。
  • 因此也可以利用這一特性,將MOVE當作鎖原語。
  • 移除成功返回1,失敗則返回0。

DEL

  • DEL key [key …]
  • 刪除給定的一個或多個key。
  • 不存在的key會被忽略。
  • 返回被刪除key的數量。

RANDOMKEY

  • RANDOMKEY
  • 從當前數據庫中隨機返回(不刪除)一個key。
  • 當數據庫不為空時,返回一個key。當數據庫為空時,返回nil。

DBSIZE

  • DBSIZE
  • 返回當前數據庫的key的數量。

KEYS

  • KEYS pattern
  • 查找所有符號給定模式pattern的key,比如說:
    • KEYS *匹配數據庫中所有key。
    • kEYS h?llo匹配hello,hallo和hxllo等。
    • kEYS h*llo匹配hllo和heeeello等。
    • KEYS h[ae]llo匹配hello和hallo,但不匹配hillo。
  • 特殊符號用\隔開。
  • 返回給定模式的key列表。

SCAN

  • SCAN cursor [MATCH pattern] [COUNT count]
  • SCAN命令及其相關的SSCAN命令、HSCAN命令和ZSCAN命令都用於增量地迭代一集元素:
    • SCAN命令用於迭代當前數據庫中的數據庫鍵。
    • SSCAN命令用於迭代集合鍵中的元素。
    • HSCAN命令用於迭代哈希鍵中的鍵值對。
    • ZSCAN命令用於迭代有序集合中的元素(包括元素成員和元素分值)。
  • 以上列出的四個命令都支持增量式迭代,它們每次執行都只會返回少量元素,所以這些命令可以用於生產環境,而不會出現像KEYS命令、SMEMBERS命令帶來的問題——當KEYS命令被用於處理一個大的數據庫時,又或者SMEMBERS命令被用於處理一個大的集合鍵時,它們可能會阻塞服務器達數秒之久。
  • 不過,增量式迭代命令也不是沒有缺點的:舉個例子,使用SMEMBERS命令可以返回集合鍵當前包含的所有元素,但是對於SCAN這類增量式迭代命令來說,因為在對鍵進行增量式迭代的過程中,鍵可能會被修改,所以增量式迭代命令只能對被返回的元素提供有限的保證。
  • 因為SCAN、SSCAN、HSCAN和ZSCAN四個命令的工作方式都非常相似,所以這個文檔會一併介紹這四個命令
    • SSCAN命令、HSCAN命令和ZSCAN命令的第一個參數總是一個數據庫鍵。
    • 而SCAN命令則不需要在第一個參數提供任何數據庫鍵——因為它迭代的是當前數據庫中的所有數據庫鍵。
  • SCAN命令的基本用法
    • SCAN命令是一個基於游標的迭代器:SCAN命令每次被調用之後,都會向用戶返回一個新的游標,用戶在下次迭代時需要使用這個新游標作為SCAN命令的游標參數,以此來延續之前的迭代過程。
    • 當SCAN命令的游標參數被設置為0時,服務器將開始一次新的迭代,而當服務器向用戶返回值為0的游標時,表示迭代已結束。
    • SCAN命令的回復是一個包含兩個元素的數組,第一個數組元素是用於進行下一次迭代的新游標,而第二個數組元素則是一個數組,這個數組中包含了所有被迭代的元素。
    • 以0作為游標開始一次新的迭代,一直調用SCAN命令,直到命令返回遊標0,我們稱這個過程為一次完整遍歷。
  • SCAN命令的保證
    • SCAN命令,以及其他增量式迭代命令,在進行完整遍歷的情況下可以為用戶帶來以下保證:從完整遍歷開始直到完整遍歷結束期間,一直存在於數據集內的所有元素都會被完整遍歷返回;這意味着,如果有一個元素,它從遍歷開始直到遍歷結束期間都存在於被遍歷的數據集當中,那麼SCAN命令總會在某次迭代中將這個元素返回給用戶。
    • 然而因為增量式命令僅僅使用游標來記錄迭代狀態,所以這些命令帶有以下缺點:
      • 同一個元素可能會被返回多次。處理重複元素的工作交由應用程序負責,比如說,可以考慮將迭代返回的元素僅僅用於可以安全地重複執行多次的操作上。
      • 如果一個元素是在迭代過程中被添加到數據集的,又或者是在迭代過程中從數據集中被刪除的,那麼這個元素可能會被返回,也可能不會,這是未定義的。
  • SCAN命令每次執行返回的元素數量
    • 增量式迭代命令並不保證每次執行都返回某個給定數量的元素。
    • 增量式命令甚至可能會返回零個元素,但只要命令返回的游標不是0,應用程序就不應該將迭代視作結束。
    • 不過命令返回的元素數量總是符合一定規則的,在實際中:
      • 對於一個大數據集來說,增量式迭代命令每次最多可能會返回數十個元素。
      • 而對於一個足夠小的數據集來說,如果這個數據集的底層表示為編碼數據結構,那麼增量迭代命令將在一次調用中返回數據集中的所有元素。
    • 用戶可以通過增量式迭代命令提供的COUNT選項來指定每次迭代返回元素的最大值。
  • COUNT選項
    • 雖然增量式迭代命令不保證每次迭代所返回的元素數量,但我們可以使用COUNT選項,對命令的行為進行一定程度上的調整。
    • 基本上,COUNT選項的作用就是讓用戶告知迭代命令,在每次迭代中應該從數據集里返回多少元素。
    • 雖然COUNT選項只是對增量式迭代命令的一種提示,但是在大多數情況下,這種提示都是有效的。
      • COUNT參數的默認值為10。
      • 在迭代一個足夠大的、由哈希表實現的數據庫、集合鍵、哈希鍵或者有序集合鍵時,如果用戶沒有使用MATCH選項,那麼命令返回的元素數量通常和COUNT選項指定的一樣,或者比COUNT選項指定的數量稍多一些。
      • 在迭代一個編碼為整數集合、或者編碼為壓縮列表時,增量式迭代命令通常會無視COUNT選項指定的值,在第一次迭代就將數據集包含的所有元素都返回給用戶。
      • 並非每次迭代都要使用相同的COUNT值。
      • 用戶可以在每次迭代中按自己的需要隨意改變COUNT值,只要記得將上次迭代返回的游標用到下次迭代里就可以了。
  • MATCH選項
    • 和KEYS命令一樣,增量式迭代命令也可以通過提供一個glob風格的模式參數,讓命令只返回和給定模式相匹配的元素,這一點可以通過在執行增量式迭代命令時,通過給定MATCH 參數來實現。比如sscan key 0 match f*
    • 對元素的模式匹配工作是在命令從數據集中取出元素之後,向客戶端返回元素之前的這段時間內進行的,所有如果被迭代的數據集中只有少量元素和模式相匹配,那麼迭代命令或許會在多次執行中都不返回任何元素。
  • 並發執行多個迭代
    • 在同一時間,可以有任意多個客戶端對同一數據集進行迭代,客戶端每次執行都需要傳入一個游標,並在迭代執行之後獲得一個新的游標,而這個游標就包含了迭代的所有狀態,因此,服務器無須為迭代記錄任何狀態。
  • 中途停止迭代
    • 因為迭代的所有狀態都保存在游標裏面,而服務器無須為迭代保存任何狀態,所以客戶端可以在中途停止一個迭代,而無須對服務器進行任何通知。
    • 即使有任意數量的迭代在中途停止,也不會產生任何問題。
  • 使用錯誤的游標進行增量式迭代
    • 使用間斷的、負數、超出範圍或者其他非正常的游標來執行增量式迭代並不會造成服務器崩潰,但可能會讓命令產生未定義的行為。
    • 未定義行為指的是,增量式命令對返回值所做的保證可能會不再為真。
    • 只有兩種游標是合法的:
      • 1、在開始一個新的迭代時,游標必須為0。
      • 2、增量式迭代命令在執行之後返回的,用於延續迭代過程的游標。
  • 迭代終結的保證
    • 增量式迭代命令所使用的算法只保證在數據集的大小有界的情況下,迭代才會停止,換句話說,如果被迭代數據集的大小不斷地增長的話,增量式迭代命令可能永遠也無法完成一次完整迭代。
    • 從直覺上可以看出,當一個數據集不斷地變大時,想要訪問這個數據集中的所有元素就需要做越來越多的工作,能否結束一個迭代取決於用戶執行迭代的速度是否比數據集增長的速度更快。
  • 返回值
    • SCAN命令、SSCAN命令、HSCAN命令和ZSCAN命令都返回一個包含兩個元素的multi-bulk回復:回復的第一個元素是字符串表示的無符號64位整數,回復的第二個元素是另一個multi-bulk回復,這個multi-bulk回復包含了本次被迭代的元素。
    • SCAN命令返回的每個元素都是一個數據庫鍵。
    • SSCAN命令返回的每個元素都是一個集合成員。
    • HSCAN命令返回的每個元素都是一個鍵值對,一個鍵值對由一個鍵和一個值組成。
    • ZSCAN命令返回的每個元素都是一個有序集合元素,一個有序集合元素由一個成員和一個分值組成。

SORT

  • SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern …]] [ASC | DESC] [ALPHA] [STORE destination]
  • 返回或保存給定列表、集合、有序集合key中經過排序的元素。
  • 排序默認以數字作為對象,值被解釋為雙精度浮點數,然後進行比較。
  • 最簡單的SORT使用方法是SORT key和SORT key DESC。
    • SORT key返回鍵值從小到大排序的結果。
    • SORT key DESC返回鍵值從大到小排序的結果。
  • 因為SORT命令默認排序對象為數字,當需要對字符串進行排序時,需要顯式地在SORT命令之後添加ALPHA修飾符。
  • 排序之後返回元素的數量可以通過LIMIT修飾符進行限制,修飾符接受offset和count兩個參數:
    • offset指定要跳過的元素數量。
    • count指定跳過offset個指定的元素之後,要返回多少個對象。
  • 可以使用外部key的數據作為權重, 代替默認的直接對比的鍵值的方式來進行排序。
    • 通過BY選項,可以讓key讓其他鍵的元素來排序,比如SORT key BY other_*讓key鍵按照other_{key}的大小來排序。other_*是一個佔位符,它先取出key中的值,然後在用這個值來查找對應的鍵。
    • 使用GET選項,可以根據排序的結果來取出相應的鍵值,比如SORT key GET other_*,先排序key,在取出鍵other_{key}的值

FLUSHDB

  • FLUSHDB
  • 清空當前數據庫中的所有key。
  • 此命令從不失敗。
  • 總是返回OK。

FLUSHALL

  • FLUSHALL
  • 清空整個Redis服務器的數據(刪除所有數據庫的所有key)。
  • 此命令從不失敗。
  • 總是返回OK。

SELECT

  • SELECT index
  • 切換到指定的數據庫,數據庫索引號index用數字值指定,以0作為起始索引值。
  • 默認使用0號數據庫。
  • 返回OK。

SWAPDB

  • SWAPDB db1 db2
  • 對換指定的兩個數據庫,使得兩個數據庫的數據立即互換。
  • 返回OK。

自動過期


EXPIRE

  • EXPIRE key seconds
  • 為給定key設置生存時間,當key過期時,它會被自動刪除。
  • 在Redis中,帶有生存時間的key被稱為易失的。
  • 生存時間可以通過使用DEL命令來刪除整個key來移除,或者被SET和GETSET命令覆寫,這意味着,如果一個命令只是修改一個帶生存時間的key的值而不是用一個新的key值來代替它的話,那麼生存時間不會被改變。
  • 比如說,對一個key執行INCR命令,對一個列表進行LPUSH命令,或者對一個哈希表執行HSET命令,這類操作都不會修改key本身的生存時間。
  • 另一方面,如果使用RENAME對一個key進行改名,那麼改名後的key的生成時間和改名前一樣。
  • RENAME命令的另一種可能是,嘗試將一個帶生存時間的key改名成另一個帶生存時間的another_key,這時舊的another_key會被刪除,然後舊的key會改名為another_key,因此,新的another_key的生存時間也和原本的key一樣。
  • 使用PERSIST命令可以在不刪除key的情況下,移除key的生存時間,讓key重新成為一個持久的key。
  • 可以對一個已經帶有生存時間的key執行EXPIRE命令,新指定的生存時間會取代舊的生存時間。
  • 設置成功返回1。當key不存在或者不能為key設置生存時間時,返回0。

EXPIREAT

  • EXPIREAT key timestamp
  • EXPIREAT的作用和EXPIRE類似,都用於為key設置生存時間。
  • 不同在於EXPIREAT命令接受的時間參數是UNIX時間戳。
  • 如果生存時間設置成功,返回1;當key不存在或沒辦法設置生存時間, 返回0。

TTL

  • TTL key
  • 以秒為單位,返回給定key的剩餘生存時間。
  • 當key不存在時,返回-2。當key存在但沒有設置剩餘生存時間時,返回-1。否則,以秒為單位,返回key的剩餘生存時間。

PERSIST

  • PERSIST key
  • 移除給定key的生存時間,將這個key從易失的轉換成持久的。
  • 當生存時間移除成功時,返回1,如果key不存在或key沒有設置生存時間,返回0。

PEXPIRE

  • PEXPIRE key milliseconds
  • 這個命令和EXPIRE命令的作用類似,但是它以毫秒為單位設置key的生存時間,而不是秒。
  • 設置成功,返回1;key不存在或設置失敗,返回0。

PEXPIREAT

  • PEXPIREAT key milliseconds-timestamp
  • 這個命令和EXPIREAT命令類似,但它以毫秒為單位設置key的過期unix時間戳,而不是像expireat那樣,以秒為單位。
  • 如果生存時間設置成功,返回1。當key不存在或沒辦法設置生存時間時,返回0。

PTTL

  • PTTL key
  • 這個命令類似於TTL命令,但它以毫秒為單位返回key的剩餘生存時間,而不是秒。
  • 當key不存在時,返回-2;當key存在但是沒有設置剩餘生存時間時,返回-1;否則,以毫秒為單位,返回key的剩餘生存時間。

事務


MULTI

  • MULTI
  • 標記一個事務塊的開始。
  • 事務塊內的多條命令會按照先後順序被放進一個隊列當中,最後由EXEC命令原子性地執行。
  • 總是返回OK。

EXEC

  • EXEC
  • 執行所有事務塊內的命令。
  • 假如某個key正處在WATCH命令的監視之下,且事務塊中有和這個key相關的命令,那麼EXEC命令只在這個key沒有被其他命令所改動的情況下執行並生效,否則該事務被打斷。
  • 返回事務塊內所有命令的返回值,按命令執行的先後順序排列;當操作被打斷時,返回空值nil。

DISCARD

  • DISCARD
  • 取消事務,放棄執行事務塊內的所有命令。
  • 如果正在使用WATCH命令監視某個key,那麼取消所有監視,等同於執行命令UNWATCH。
  • 總是返回OK。

WATCH

  • WATCH key [key …]
  • 監視一個或多個key,如果在事務執行之前這個或這些key被其他命令所改動,那麼事務將被打斷。
  • 總是返回OK。

UNWATCH

  • UNWATCH
  • 取消WATCH命令對所有key的監視。
  • 如果在執行WATCH命令之後,EXEC命令或DISCARD命令先被執行了的話,那麼就不需要再執行UNWATCH了。
  • 因為EXEC命令會執行事務,因此WATCH命令的效果已經產生了;而DISCARD命令在取消事務的同時也會取消所有對key的監視,因此這兩個命令執行之後,就沒有必要執行UNWATCH了。
  • 總是返回OK。

HyperLogLog


PFADD

  • PFADD key element [element …]
  • 將任意數量的元素添加到指定的HyperLogLog裏面。
  • 作為這個命令的副作用,HyperLogLog內部可能會被更新,以便反映一個不同的唯一元素估計數量(也即是集合的基數)。
  • 如果HyperLogLog估計的近似基數在命令執行之後出現了變化,那麼命令返回1,否則返回0。如果命令執行時給定的鍵不存在,那麼程序將先創建一個空的HyperLogLog結構,然後再執行命令。
  • 調用此命令時可以只給定鍵名而不給定元素
    • 如果給定鍵已經是一個HyperLogLog,那麼這種調用不會產生任何效果。
    • 但如果給定的鍵不存在,那麼命令會創建一個空的HyperLogLog,並向客戶端返回1。
  • 如果HyperLogLog的內部儲存被修改了,那麼返回1,否則返回0。

PFCOUNT

  • PFCOUNT key [key …]
  • 當PFCOUNT key [key …]命令作用於單個鍵時,返回儲存在給定鍵的HyperLogLog的近似基數,如果鍵不存在,那麼返回0。
  • 當PFCOUNT key [key …]命令作用於多個鍵時,返回所有給定HyperLogLog的並集的近似基數,這個近似基數是通過將所有給定HyperLogLog合併至一個臨時HyperLogLog來計算得出的。
  • 通過HyperLogLog數據結構,用戶可以使用少量固定大小的內存,來儲存集合中的唯一元素(每個HyperLogLog只需使用12k位元組內存,以及幾個位元組的內存來儲存鍵本身)。
  • 命令返回的可見集合基數並不是精確值,而是一個帶有0.81%標準錯誤的近似值。
  • 返回給定HyperLogLog包含的唯一元素的近似數量。

PFMERGE

  • PFMERGE destkey sourcekey [sourcekey …]
  • 將多個HyperLogLog合併為一個HyperLogLog,合併後的HyperLogLog的基數接近於所有輸入HyperLogLog的可見集合的並集。
  • 合併得出的hyperLogLog會被儲存在destkey鍵裏面,如果該鍵並不存在,那麼命令在執行之前,會先為該鍵創建一個空的HyperLogLog。
  • 返回OK。

地理位置


GEOADD

  • GEOADD key longitude latitude member [longitude latitude member …]
  • 將給定的空間元素(緯度、經度、名字)添加到指定的鍵裏面。這些數據會以有序集合的形式被儲存在鍵裏面,從而使得像GEORADIUS和GEORADIUSBYMEMBER這樣的命令可以在之後通過位置查詢取得這些元素。
  • GEOADD命令以標準的x,y格式接受參數,所以用戶必須先輸入經度,然後再輸入緯度。
  • GEOADD能夠記錄的坐標是有限的:非常接近兩極的區域是無法被索引的。精確的坐標限制由坐標系統定義,具體如下:
    • 有效的經度介於-180度至180度之間。
    • 有效的緯度介於-85.05112878度至85.05112878度之間。
  • 當用戶嘗試輸入一個超出範圍的經度或者緯度時,GEOADD命令將返回一個錯誤。
  • 返回新添加到鍵裏面的空間元素數量,不包括那些已經存在但是被更新的元素。

GEOPOS

  • GEOPOS key member [member …]
  • 從鍵裏面返回所有給定位置元素的位置(經度和緯度)。
  • 因為GEOPOS命令接受可變數量的位置元素作為輸入,所以即使用戶只給定了一個位置元素,命令也會返回數組回復。
  • 返回一個數組,數組中的每個項都由兩個元素組成:第一個元素為給定位置元素的經度,而第二個元素則為給定位置元素的緯度。當給定的位置元素不存在時,對應的數組項為空值。

GEODIST

  • GEODIST key member1 member2 [unit]
  • 返回兩個給定位置之間的距離。
  • 如果兩個位置之間的其中一個不存在,那麼命令返回空值。
  • 指定單位的參數unit必須是以下單位的其中一個:
    • m表示單位為米
    • km表示單位為千米
    • mi表示單位為英里
    • ft表示單位為英尺
  • 如果用戶沒有顯式地指定單位參數,那麼GEODIST默認使用米作為單位。
  • GEODIST命令在計算距離時會假設地球為完美的球形,在極限情況,這一假設最大會造成0.5%的誤差。
  • 計算出的距離會以雙精度浮點數的形式被返回。如果給定的位置元素不存在,那麼命令返回空值。

GEORADIUS

  • GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
  • 以給定的經緯度為中心,返回鍵包含的位置元素當中,與中心的距離不超過給定的最大距離的所有位置元素。
  • 範圍可以使用以下其中一個單位:
    • m表示單位為米
    • km表示單位為千米
    • mi表示單位為英里
    • ft表示單位為英尺
  • 在給定以下可選項時,命令會返回額外的信息:
    • WITHDIST:在返回位置元素的同時,將位置元素與中心之間的距離也一併返回。距離的單位和用戶給定的範圍單位保持一致。
    • WITHCOORD:將位置元素的經度和緯度也一併返回。
    • WITHHASH:以52位有符號整數的形式,返回位置元素經過原始geohash編碼的有序集合分值。這個選項主要用於底層應用或者調試,實際中的作用並不大。
  • 命令默認返回未排序的位置元素。通過以下兩個參數,用戶可以指定被返回位置元素的排序方式:
    • ASC:根據中心的位置,按照從近到遠的方式返回位置元素。
    • DESC:根據中心的位置,按照從遠到近的方式返回位置元素。
  • 在默認情況下,GEORADIUS命令會返回所有匹配的位置元素。雖然用戶可以使用COUNT 選項去獲取前N個匹配元素,但是因為命令在內部可能會需求對所有被匹配的元素進行處理,所以在對一個非常大的區域進行搜索時,即使只使用COUNT選項去獲取少量元素,命令的執行速度也可能會非常慢。但是從另一個方面來說,使用COUNT選項去減少需求返回的元素數量,對於減少帶寬來說仍然是非常有用的。
  • GEORADIUS命令返回一個數組,具體來說:
    • 在沒有給定任何WITH選項的情況下,命令只會返回一個像["New York", "Milan", "Paris"]這樣的線性列表。
    • 在指定了WITHCOORD、WITHDIST、WITHHASH等選項的情況下,命令返回一個二層嵌套數組,內層的每個子數組就表示一個元素。
  • 在返回嵌套數組時,子數組的第一個元素總是位置元素的名字。至於額外的信息,則會作為子數組的後續元素,按照以下順序被返回:
    • 1、以浮點數格式返回的中心與位置元素之間的距離,單位與用戶指定範圍時的單位一致。
    • 2、geohash整數。
    • 3、由兩個元素組成的坐標,分別為經度和緯度。

GEORADIUSBYMEMBER

  • GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
  • 這個命令和GEORADIUS命令一樣,都可以找出位於指定範圍內的元素,但是GEORADIUSBYMEMBER的中心點是由給定的位置元素決定的,而不是像GEORADIUS那樣,使用輸入的經度和緯度來決定中心點。
  • 返回一個數組,數組中的每個項表示一個範圍之內的位置元素。

GEOHASH

  • GEOHASH key member [member …]
  • 返回一個數組,數組的每個項都是一個geohash。命令返回的geohash的位置與用戶給定的位置元素的位置一一對應。

位圖


SETBIT

  • SETBIT key offset value
  • 對key所儲存的字符串值,設置或清除指定偏移量上的位(bit)。
  • 位的設置或清除取決於value參數,可以是0也可以是1。
  • 當key不存在時,自動生成一個新的字符串值。
  • 字符串會進行伸展以確保它可以將value保存在指定的偏移量上。當字符串值進行伸展時,空白位置以0填充。
  • offset參數必須大於或等於0,小於2^32(bit映射被限制在512MB之內)。
  • 返回指定偏移量原來儲存的位。

GETBIT

  • GETBIT key offset
  • 對key所儲存的字符串值,獲取指定偏移量上的位(bit)。
  • 當offset比字符串值的長度大,或者key不存在時,返回0。

BITCOUNT

  • BITCOUNT key [start] [end]
  • 計算給定字符串中,被設置為1的比特位的數量。
  • 一般情況下,給定的整個字符串都會被進行計數,通過指定額外的start或end參數,可以讓計數只在特定的位上進行。
  • start和end參數的設置和GETRANGE命令類似,都可以使用負數值:比如-1表示最後一個位元組,以此類推。
  • 不存在的key被當成是空字符串來處理,因此對一個不存在的key進行BITCOUNT操作,結果為0。

BITPOS

  • BITPOS key bit [start] [end]
  • 返回位圖中第一個值為bit的二進制位的位置,返回一個整數。
  • 在默認情況下,命令將檢測整個位圖,但用戶也可以通過可選的start參數和end參數指定要檢測的範圍。

BITOP

  • BITOP operation destkey key [key …]
  • 對一個或多個保存二進制位的字符串key進行位元操作,並將結果保存到destkey上。
  • operation可以是AND、OR、NOT、XOR這四種操作中的任意一種:
    • AND:邏輯並
    • OR:邏輯或
    • NOT:邏輯非,只接受一個key
    • XOR:邏輯異或
  • 除了NOT操作之外,其他操作都可以接受一個或多個key作為輸入。
  • 當BITOP處理不同長度的字符串時,較短的那個字符串所缺少的部分會被看作0。
  • 空的key也被看作是包含0的字符串序列。
  • 返回保存到destkey的字符串的長度,和輸入key中最長的字符串長度相等。

BITFIELD

  • BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
  • BITFIELD命令可以將一個Redis字符串看作是一個由二進制位組成的數組,並對這個數組中儲存的長度不同的整數進行訪問(被儲存的整數無需進行對齊)。換句話說,通過這個命令,用戶可以執行諸如「對偏移量1234上的5位長有符號整數進行設置」、「獲取偏移量4567上的31位長無符號整數」等操作。此外,BITFIELD命令還可以對指定的整數執行加法操作和減法操作,並且這些操作可以通過設置妥善地處理計算時出現的溢出情況。
  • BITFIELD命令可以在一次調用中同時對多個位範圍進行操作:它接受一系列待執行的操作作為參數,並返回一個數組作為回復,數組中的每個元素就是對應操作的執行結果。
  • 注意:
    • 使用GET子命令對超出字符串當前範圍的二進制位進行訪問(包括鍵不存在的情況),超出部分的二進制位的值將被當做是0。
    • 使用SET子命令或者INCRBY子命令對超出字符串當前範圍的二進制位進行訪問將導致字符串被擴大,被擴大的部分會使用值位0的二進制位進行填充。在對字符串進行擴展時,命令會根據字符串目前已有的最遠端二進制位,計算出執行操作所需的最小長度。
  • 以下是BITFIELD命令支持的子命令:
    • GET<type><offset>——返回指定的二進制位範圍。
    • SET<type><offset><value>——對指定的二進制位範圍進行設置,並返回它的舊值。
    • INCRBY<type><offset><increment>——對指定的二進制位範圍執行加法操作,並返回它的舊值。用戶可以通過向increment參數傳入負值來實現相應的減法操作。
  • 除了以上三個子命令之外,還有一個子命令,它可以改變之後執行的INCRBY子命令在發生溢出情況時的行為:
    • OVERFLOW [WRAP|SAT|FAIL]
  • 當被設置的二進制位範圍值為整數時,用戶可以在類型參數的前面添加i來表示有符號整數,或者使用u來表示無符號整數。比如說,我們可以使用u8來表示8位長的無符號整數,也可以使用i16來表示16位長的有符號整數。
  • BITFIELD命令最大支持64位長的有符號整數以及63位長的無符號整數。
  • 在二進制位範圍命令中,用戶有兩種方法來設置偏移量:
    • 如果用戶給定的是一個沒有任何前綴的數字,那麼這個數字指示的就是字符串以零為開始的偏移量。
    • 另一方面,如果用戶給定的是一個帶有#前綴的偏移量,那麼命令將使用這個偏移量與被設置的數字類型的位長度相乘,從而計算出真正的偏移量。
    • 比如BITFIELD mystring SET i8 #0 100 i8 #1 200,命令會把mystring鍵裏面,第一個i8長度的二進制位的值設置為100,並把第二個i8長度的二進制位的值設置為200。當我們把第一個字符串鍵當成數組來使用,並且數組中儲存的都是同等長度的整數時,使用#前綴可以讓我們免去手動計算被設置二進制位所在位置的麻煩。
  • 用戶可以通過OVERFLOW命令以及以下展示的三個參數,指定BITFIELD命令在執行自增或者自減操作時,碰上向上溢出或者向下溢出情況時的行為:
    • WRAP:使用迴繞方法處理有符號整數和無符號整數的溢出情況。對於無符號整數來說,迴繞就像使用數值本身與能夠被儲存的最大無符號整數執行取模計算,這也是C語言的標準行為。對於有符號整數來說,上溢將導致數字重新從最小的負數開始計算,而下溢將導致數字重新從最大的正數開始計算。比如說,如果我們對一個值為127的i8整數執行加一操作,那麼將得到結果-128。
    • SAT:使用飽和計算方法處理溢出,也即是說,下溢計算的結果為最小的整數值,而上溢計算的結果為最大的整數值。舉個例子,如果我們對一個值為120的i8整數執行加10計算,那麼命令的結果將為i8類型所能儲存的最大整數值127。與此相反,如果一個針對i8值的計算造成了下溢,那麼這個i8值將被設置為-127。
    • FAIL:在這一模式下,命令將拒絕執行那些會導致上溢或者下溢情況出現的計算,並向用戶返回空值表示計算未被執行。
  • 需要注意的是,OVERFLOW子命令只會對緊隨着它之後被執行的INCRBY命令產生效果,這一效果將一直持續到與它一同被執行的下一個OVERFLOW命令為止。在默認情況下,INCRBY命令使用WRAP方式來處理溢出計算。
  • BITFIELD命令的作用在於它能夠將很多小的整數儲存到一個長度較大的位圖中,又或者將一個非常龐大的鍵分割位多個較小的鍵來進行儲存,從而非常高校地使用內存,使得Redis能夠得到更多不同的應用——特別是在實時分析領域:BITFIELD能夠以指定的方式對計算溢出進行空值的能力,使得它可以被應用於這一領域。
  • BITFIELD在一般情況下都是一個快速的命令,需要注意的是,訪問一個長度較短的字符串的遠端二進制位將引發一次內存分配操作,這一操作花費的時間可能會比命令訪問已有的字符串花費的時間要長。
  • BITFIELD把位圖第一個位元組偏移量0上的二進制位看作是most significant位,以此類推。舉個例子,如果我們對一個已經預先被全部設置為0的位圖進行設置,將它在偏移量7的值設置為5位無符號整數值23(二進制位為10111),那麼命令將生產出如下這個位圖表示00000001 01110000。當偏移量和整數長度與位元組邊界進行對齊時,BITFIELD表示二進制位的方式跟大端表示法一致,但是在沒有對齊的情況下,理解這些二進制位是如何進行排列也是非常重要的。
  • BITFIELD命令的返回值是一個數組,數組中的每個元素對應一個被執行的子命令。需要注意的是,OVERFLOW子命令本身並不產生任何回復。

持久化


SAVE

  • SAVE
  • SAVE命令執行一個同步保存操作,將當前Redis實例的所有數據快照以RDB文件的形式保存到硬盤。
  • 一般來說,在生產環境很少執行SAVE操作,因為它會阻塞所有客戶端,保存數據庫的任務通常由BGSAVE命令異步地執行。然而,如果負責保存數據的後檯子進程不幸出現問題時,SAVE可以作為保存數據的最後手段來使用。
  • 保存成功時返回OK。

BGSAVE

  • BGSAVE
  • 在後台異步保存當前數據庫的數據到磁盤。
  • BGSAVE命令執行之後立即返回OK,然後Redis fork出一個新子進程,原來的Redis進程繼續處理客戶端請求,而子進程則負責將數據保存到磁盤,然後退出。
  • 客戶端可以通過LASTSAVE命令查看相關信息,判斷BGSAVE命令是否執行成功。

BGREWRITEAOF

  • BGREWRITEAOF
  • 執行一個AOF文件重寫操作。重寫會創建一個當前AOF文件的體積優化版本。
  • 即使BGREWRITEAOF執行失敗,也不會有任何數據丟失,因為舊的AOF文件在BGREWRITEAOF成功之前不會被修改。
  • 重寫操作只會在沒有其他持久化工作在後台執行時被觸發,也就是說:
    • 如果Redis的子進程正在執行快照的保存工作,那麼AOF重寫的操作會被預定,等到保存工作完成之後再執行AOF重寫。在這種情況下,BGREWRITEAOF的返回值仍然是OK,但還會加上一條額外的信息,說明BGREWRITEAOF要等到保存操作完成之後才能執行。在Redis2.6或以上的版本,可以使用INFO[section]命令查看BGREWRITEAOF是否被預定。
    • 如果已經有別的AOF文件重寫在執行,那麼BGREWRITEAOF返回一個錯誤,並且這個新的BGREWRITEAOF請求也不會被預定到下次執行。
  • 從Redis2.4開始,AOF重寫由Redis自行出發,BGREWRITEAOF僅僅用於手動觸發重寫操作。

LASTSAVE

  • LASTSAVE
  • 返回最近一次Redis成功將數據保存到磁盤上的時間,以UNIX時間戳格式表示。

發佈與訂閱


PUBLISH

  • PUBLISH channel message
  • 將信息message發送到指定的頻道channel。
  • 返回接收到信息message的訂閱者數量。

SUBSCRIBE

  • SUBSCRIBE channel [channel …]
  • 訂閱給定的一個或多個頻道的信息。
  • 返回接收到的信息,前面是訂閱頻道成功與否的情況,後面是訂閱頻道返回的信息,頻道順序按輸入順序。
# 訂閱 msg 和 chat_room 兩個頻道

# 1 - 6 行是執行 subscribe 之後的反饋信息
# 第 7 - 9 行才是接收到的第一條信息
# 第 10 - 12 行是第二條

redis> subscribe msg chat_room
Reading messages... (press Ctrl-C to quit)
1) "subscribe"       # 返回值的類型:顯示訂閱成功
2) "msg"             # 訂閱的頻道名字
3) (integer) 1       # 目前已訂閱的頻道數量

1) "subscribe"
2) "chat_room"
3) (integer) 2

1) "message"         # 返回值的類型:信息
2) "msg"             # 來源(從那個頻道發送過來)
3) "hello moto"      # 信息內容

1) "message"
2) "chat_room"
3) "testing...haha"

PSUBSCRIBE

  • PSUBSCRIBE pattern [pattern …]
  • 訂閱一個或多個符合給定模式的頻道。
  • 每個模式以*作為匹配符。
  • 返回接收到的信息,先返回訂閱頻道成功與否的情況,對應模式,後返回訂閱頻道返回的信息。
# 訂閱 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"

UNSUBSCRIBE

  • UNSUBSCRIBE [channel [channel …]]
  • 提示客戶端退訂給定的頻道。
  • 如果沒有頻道被指定,也即是,一個無參數的UNSUBSCRIBE調用被執行,那麼客戶端使用SUBSCRIBE命令訂閱的所有頻道都會被退訂。在這種情況下,命令會返回一個信息,告知客戶端所有被退訂的頻道。

PUNSUBSCRIBE

  • PUNSUBSCRIBE [pattern [pattern …]]
  • 指示客戶端退訂所有給定模式。
  • 如果沒有模式被指定,也即是,一個無參數的PUNSUBSCRIBE調用被執行,那麼客戶端使用PSUBSCRIBE命令訂閱的所有模式都會被退訂。在這種情況下,命令會返回一個信息,告知客戶端所有被退訂的模式。

PUBSUB

  • PUBSUB <subcommand> [argument [argument …]]
  • PUBSUB是一個查看訂閱與發佈系統狀態的內省命令,它由數個不同格式的子命令組成,以下將分別對這些子命令進行介紹。
    • PUBSUB CHANNELS [pattern]
      • 列出當前的活躍頻道。
      • 活躍頻道指的是那些至少有一個訂閱者的頻道,訂閱模式的客戶端不計算在內。
      • pattern參數是可選的:
        • 如果不給出pattern參數,那麼列出訂閱與發佈系統中的所有活躍頻道。
        • 如果給出pattern參數,那麼只列出和給定模式pattern相匹配的那些活躍頻道。
      • 返回一個由活躍頻道組成的列表。
      client-3> PUBSUB CHANNELS
      1) "news.sport"
      2) "news.internet"
      3) "news.it"
      
      # 接下來, client-3 打印那些與模式 news.i* 相匹配的活躍頻道
      # 因為 news.sport 不匹配 news.i* ,所以它沒有被打印
      
      redis> PUBSUB CHANNELS news.i*
      1) "news.internet"
      2) "news.it"    
      
    • PUBSUB NUMSUB [channel-1 … channel-N]
      • 返回給定頻道的訂閱者數量,訂閱模式的客戶端不計算在內。
      • 返回一個多條批量回復,回復中包含給定的頻道,以及頻道的訂閱者數量。格式為頻道channel-1,channel-1的訂閱者數量,頻道channel-2,以此類推。回復中頻道的排列順序和執行命令時給定頻道的排列順序一致。不給定任何頻道而直接調用這個命令也是可以的,在這種情況下,命令只返回一個空列表。
      client-3> PUBSUB NUMSUB news.it news.internet news.sport news.music
      1) "news.it"    # 頻道
      2) "2"          # 訂閱該頻道的客戶端數量
      3) "news.internet"
      4) "1"
      5) "news.sport"
      6) "1"
      7) "news.music" # 沒有任何訂閱者
      8) "0"
      
    • PUBSUB NUMPAT
      • 返回訂閱模式的數量
      • 注意,這個命令返回的不是訂閱模式的客戶端的數量,而是客戶端訂閱的所有模式的數量總和。
      client-3> PUBSUB NUMPAT
      (integer) 4
      

複製


SLAVEOF

  • SLAVEOF host port
  • SLAVEOF命令用於在Redis運行時動態地修改複製功能的行為。
  • 通過執行SLAVEOF host port命令,可以將當前服務器轉變為指定服務器的從屬服務器。
  • 如果當前服務器已經是某個主服務器的從屬服務器,那麼執行SLAVEOF host port將使當前服務器停止對舊主服務器的同步,丟棄舊數據集,轉而開始對新主服務器進行同步。
  • 另外,對一個從屬服務器執行命令SLAVEOF NO ONE將使得這個從屬服務器關閉複製功能,並從從屬服務器轉變回主服務器,原來同步所得的數據集不會被丟棄。
  • 利用SLAVEOF NO ONE不會丟棄同步所得數據集這個特性,可以在主服務器失敗的時候,將從屬服務器用作新的主服務器,從而實現無間斷運行。
  • 總是返回OK。

ROLE

  • ROLE
  • 返回實例在複製中擔任的角色,這個角色可以是master、slave或者sentinel。除了角色之外,命令還會返回與該角色相關的其他信息,其中:
    • 主服務器將返回屬下從服務器的IP地址和端口。
    • 從服務器將返回自己正在複製的主服務器的IP地址、端口、連接狀態以及複製偏移量。
    • Sentinel將返回自己正在監視的主服務器列表。
  • ROLE命令將返回一個數組。

客戶端與服務器


AUTH

  • AUTH password
  • 通過設置配置文件中requirepass項的值(使用命令CONFIG SET requirepass password),可以使用密碼來保護Redis服務器。
  • 如果開啟了密碼保護的話,在每次連接Redis服務器之後,就要使用AUTH命令解鎖,解鎖之後才能使用其他Redis命令。
  • 如果AUTH命令給定的密碼password和配置文件中的密碼相符的話,服務器會返回OK並開始接收命令輸入。
  • 另一方面,加入密碼不匹配的話,服務器將返回一個錯誤,並要求客戶端需重新輸入密碼。

QUIT

  • QUIT
  • 請求服務器關閉與當前客戶端的連接。
  • 一旦所有等待中的回復(如果有的話)順利寫入到客戶端,連接就會被關閉。
  • 總是返回OK(但是不會被打印顯示,因為當時redis-cli已經退出)。

INFO

  • INFO [section]
  • 以一種易於解釋且易於閱讀的格式,返回關於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的部分內存被操作系統換出到交換空間了,在這種情況下,操作可能會產生明顯的延遲。當Redis釋放內存時,分配器可能會,也可能不會,將內存返還給操作系統。如果Redis釋放了內存,卻沒有將內存返還給操作系統,那麼used_memory的值可能和操作系統顯示的Redis內存佔用並不一致。查看used_memory_peak的值可以驗證這種情況是否發生。
    • persistence部分記錄了跟RDB持久化和AOF持久化有關的信息,它包含以下域:
      • loading:一個標誌值,記錄了服務器是否正在載入持久化文件。
      • rdb_changes_since_last_save:距離最近一次成功創建持久化文件之後,經過了多少秒。
      • rdb_bgsave_in_progress:一個標誌值,記錄了服務器是否正在創建RDB文件。
      • rdb_last_save_time:最近一次成功創建RDB文件的UNIX時間戳。
      • rdb_last_bgsave_status:一個標誌值,記錄了最近一次創建RDB文件的結果是成功還是失敗。
      • rdb_last_bgsave_time_sec:記錄了最近一次創建RDB文件耗費的秒數。
      • rdb_current_bgsave_time_sec:如果服務器正在創建RDB文件,那麼這個域記錄的就是當前的創建操作已經耗費的秒數。
      • aof_enabled:一個標誌值,記錄了AOF是否處於打開狀態。
      • aof_rewrite_in_progress: 一個標誌值,記錄了服務器是否正在創建AOF文件。
      • aof_rewrite_scheduled:一個標誌值,記錄了在RDB文件創建完畢之後,是否需要執行預約的AOF重寫操作。
      • aof_last_rewrite_time_sec:最近一次創建AOF文件耗費的時長。
      • aof_current_rewrite_time_sec:如果服務器正在創建AOF文件,那麼這個域記錄的就是當前的創建操作已經耗費的秒數。
      • aof_last_bgrewrite_status:一個標誌值,記錄了最近一次創建AOF文件的結果是成功還是失敗。
      • 如果AOF持久化功能處於開啟狀態,那麼這個部分還會加上以下域:
        • aof_current_size:AOF文件目前的大小。
        • aof_base_size:服務器啟動時或者AOF重寫最近一次執行之後,AOF文件的大小。
        • aof_pending_rewrite:一個標誌值,記錄了是否有AOF重寫操作在等待RDB文件創建完畢之後執行。
        • aof_buffer_length:AOF緩衝區的大小。
        • aof_rewrite_buffer_length:AOF重寫緩衝區的大小。
        • aof_pending_bio_fsync:後台I/O隊列裏面,等待執行的fsync調用數量。
        • aof_delayed_fsync:被延遲的fsync調用數量。
    • stats部分記錄了一般統計信息,它包含以下域:
      • total_connections_received:服務器已接受的連接請求數量。
      • total_commands_processed:服務器已執行的命令數量。
      • instantaneous_ops_per_sec:服務器每秒鐘執行的命令數量。
      • rejected_connections:因為最大客戶端數量限制而被拒絕的連接請求數量。
      • expired_keys:因為過期而被自動刪除的數據庫鍵數量。
      • evicted_keys:因為最大內存容量限制而被驅逐(evict)的鍵數量。
      • keyspace_hits:查找數據庫鍵成功的次數。
      • keyspace_misses:查找數據庫鍵失敗的次數。
      • pubsub_channels:目前被訂閱的頻道數量。
      • pubsub_patterns:目前被訂閱的模式數量。
      • latest_fork_usec:最近一次fork()操作耗費的毫秒數。
    • replication記錄了主從複製信息。
      • role:如果當前服務器沒有在複製任何其他服務器,那麼這個域的值就是master;否則的話,這個域的值就是slave。注意,在創建複製鏈的時候,一個從服務器也可能是另一個服務器的主服務器。
      • 如果當前服務器是一個從服務器的話,那麼這個部分還會加上以下域:
        • master_host:主服務器的IP地址。
        • master_port:主服務器的TCP監聽端口號。
        • master_link_status:複製連接當前的狀態,up表示連接正常,down表示連接斷開。
        • master_last_io_seconds_ago:距離最近一次與主服務器進行通信已經過去了多少秒鐘。
        • master_sync_in_progress:一個標誌值,記錄了主服務器是否正在與這個從服務器進行同步。
      • 如果同步操作正在進行,那麼這個部分還會加上以下域:
        • master_sync_left_bytes:距離同步完成還缺少多少位元組數據。
        • master_sync_last_io_seconds_ago:距離最近一次因為SYNC操作而進行I/O已經過去了多少秒。
      • 如果主從服務器之間的連接處於斷線狀態,那麼這個部分還會加上以下域:
        • master_link_down_since_seconds:主從服務器連接斷開了多少秒。
      • 以下是一些總會出現的域:
        • connected_slaves:已連接的從服務器數量。
      • 對於每個從服務器,都會添加以下一行信息:
        • slaveXXX:ID、IP 地址、端口號、連接狀態
    • cpu部分記錄了CPU的計算量統計信息,它包含以下域:
      • used_cpu_sys:Redis服務器耗費的系統CPU。
      • used_cpu_user:Redis服務器耗費的用戶CPU。
      • used_cpu_sys_children:後台進程耗費的系統CPU。
      • used_cpu_user_children:後台進程耗費的用戶CPU。
    • commandstats部分記錄了各種不同類型的命令的執行統計信息,比如命令執行的次數、命令耗費的CPU時間、執行每個命令耗費的平均CPU時間等等。對於每種類型的命令,這個部分都會添加一行以下格式的信息:
      • cmdstat_XXX:calls=XXX,usec=XXX,usecpercall=XXX
    • cluster部分記錄了和集群有關的信息,它包含以下域:
      • cluster_enabled:一個標誌值,記錄集群功能是否已經開啟。
    • keyspace部分記錄了數據庫相關的統計信息,比如數據庫的鍵數量、數據庫已經被刪除的過期鍵數量等。對於每個數據庫,這個部分都會添加一行以下格式的信息:
      • dbXXX:keys=XXX,expires=XXX
    • 除上面給出的這些值以外, section 參數的值還可以是下面這兩個:
      • all:返回所有信息
      • default:返回默認選擇的信息
    • 當不帶參數直接調用INFO命令時,使用default作為默認參數。
    redis> INFO
    # Server
    redis_version:2.9.11
    redis_git_sha1:937384d0
    redis_git_dirty:0
    redis_build_id:8e9509442863f22
    redis_mode:standalone
    os:Linux 3.13.0-35-generic x86_64
    arch_bits:64
    multiplexing_api:epoll
    gcc_version:4.8.2
    process_id:4716
    run_id:26186aac3f2380aaee9eef21cc50aecd542d97dc
    tcp_port:6379
    uptime_in_seconds:362
    uptime_in_days:0
    hz:10
    lru_clock:1725349
    config_file:
    
    # Clients
    connected_clients:1
    client_longest_output_list:0
    client_biggest_input_buf:0
    blocked_clients:0
    
    # Memory
    used_memory:508536
    used_memory_human:496.62K
    used_memory_rss:7974912
    used_memory_peak:508536
    used_memory_peak_human:496.62K
    used_memory_lua:33792
    mem_fragmentation_ratio:15.68
    mem_allocator:jemalloc-3.2.0
    
    # Persistence
    loading:0
    rdb_changes_since_last_save:6
    rdb_bgsave_in_progress:0
    rdb_last_save_time:1411011131
    rdb_last_bgsave_status:ok
    rdb_last_bgsave_time_sec:-1
    rdb_current_bgsave_time_sec:-1
    aof_enabled:0
    aof_rewrite_in_progress:0
    aof_rewrite_scheduled:0
    aof_last_rewrite_time_sec:-1
    aof_current_rewrite_time_sec:-1
    aof_last_bgrewrite_status:ok
    aof_last_write_status:ok
    
    # Stats
    total_connections_received:2
    total_commands_processed:4
    instantaneous_ops_per_sec:0
    rejected_connections:0
    sync_full:0
    sync_partial_ok:0
    sync_partial_err:0
    expired_keys:0
    evicted_keys:0
    keyspace_hits:0
    keyspace_misses:0
    pubsub_channels:0
    pubsub_patterns:0
    latest_fork_usec:0
    migrate_cached_sockets:0
    
    # Replication
    role:master
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    
    # CPU
    used_cpu_sys:0.21
    used_cpu_user:0.17
    used_cpu_sys_children:0.00
    used_cpu_user_children:0.00
    
    # Cluster
    cluster_enabled:0
    
    # Keyspace
    db0:keys=2,expires=0,avg_ttl=0
    

SHUTDOWN

  • SHUTDOWN [SAVE|NOSAVE]
  • SHUTDOWN命令執行以下操作:
    • 停止所有客戶端
    • 如果有至少一個保存點在等待,執行SAVE命令
    • 如果AOF選項被打開,更新AOF文件
    • 關閉redis服務器
  • 如果持久化被打開的話,SHUTDOWN命令會保證服務器正常關閉而不丟失任何數據,
  • 另一個方面,假如只是單純地執行SAVE命令,然後再執行QUIT命令,則沒有這一保證——因為在執行SAVE之後,執行QUIT之前的這段時間中間,其他客戶端可能正在和服務器進行通訊,這時如果執行QUIT就會造成數據丟失。
  • 通過使用可選的修飾符,可以修改SHUTDOWN命令的表現。比如說:
    • 執行SHUTDOWN SAVE會強制讓數據庫執行保存操作,即使沒有設定保存點。
    • 執行SHUTDOWN NOSAVE會阻止數據庫執行保存操作,即使已經設定有一個或多個保存點。
  • 執行失敗時返回錯誤。執行成功時不返回任何信息,服務器和客戶端的連接斷開,客戶端自動退出。

TIME

  • TIME
  • 返回當前服務器時間。
  • 一個包含兩個字符串的列表:第一個字符串是當前時間(以UNIX時間戳格式表示10位,精確到秒),而第二個字符串是當前這一秒鐘已經逝去的微秒數(6位數)。

CLIENT_GETNAME

  • CLIENT GETNAME
  • 返回CLIENT SETNAME命令為連接設置的名字。
  • 因為新創建的連接默認是沒有名字的,對於沒有名字的連接,CLIENT GETNAME返回空白回復。

CLIENT_SETNAME

  • CLIENT SETNAME connection-name
  • 為當前連接分配一個名字。
  • 這個名字會顯示在CLIENT LIST命令的結果中,用於識別當前正在與服務器進行連接的客戶端。
  • 舉個例子,在使用Redis構建隊列時,可以根據連接負責的任務,為信息生產者和信息消費者分別設置不同的名字。
  • 名字使用Redis的字符串類型來保存,最大可以佔用512MB。另外,為了避免和CLIENT LIST命令的輸出格式發生衝突,名字里不允許使用空格。
  • 要移除一個連接的名字,可以將連接的名字設為空字符串””。
  • 使用CLIENT GETNAME命令可以取出連接的名字。
  • 新創建的連接默認是沒有名字的。
  • 設置成功時返回OK。

CLIENT_LIST

  • CLIENT LIST
  • 以人類可讀的格式,返回所有連接到服務器的客戶端信息和統計數據。
  • 命令返回多行字符串,這些字符串按以下形式被格式化:
    • 每個已連接客戶端對應一行(以LF分割)
    • 每行字符串由一系列屬性=值形式的域組成,每個域之間以空格分開
  • 以下是域的含義:
    • addr:客戶端的地址和端口
    • fd:套接字所使用的文件描述符
    • age:以秒計算的已連接時長
    • idle:以秒計算的空閑時長
    • flags:客戶端flag(見下文)
    • db:該客戶端正在使用的數據庫ID
    • sub:已訂閱頻道的數量
    • psub:已訂閱模式的數量
    • multi:在事務中被執行的命令數量
    • qbuf:查詢緩衝區的長度(位元組為單位,0表示沒有分配查詢緩衝區)
    • qbuf-free:查詢緩衝區剩餘空間的長度(位元組為單位,0表示沒有剩餘空間)
    • obl:輸出緩衝區的長度(位元組為單位,0表示沒有分配輸出緩衝區)
    • 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
  • 文件描述符events事件可以是:
    • r:客戶端套接字(在事件loop中)是可讀的(readable)
    • w:客戶端套接字(在事件loop中)是可寫的(writeable)
redis> CLIENT LIST
addr=127.0.0.1:43143 fd=6 age=183 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
addr=127.0.0.1:43163 fd=5 age=35 idle=15 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
addr=127.0.0.1:43167 fd=7 age=24 idle=6 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=get

CLIENT_KILL

  • CLIENT KILL ip:port
  • 關閉地址為ip:port的客戶端。
  • ip:port應該和CLIENT LIST命令輸出的其中一行匹配。
  • 因為Redis使用單線程設計,所以當Redis正在執行命令的時候,不會有客戶端被斷開連接。
  • 如果要被斷開連接的客戶端正在執行命令,那麼當這個命令執行之後,在發送下一個命令的時候,它就會收到一個網絡錯誤,告知它自身的連接已被關閉。
  • 當指定的客戶端存在,且被成功關閉時,返回OK。

配置選項


CONFIG_SET

  • CONFIG SET parameter value
  • CONFIG SET命令可以動態地調整Redis服務器的配置而無須重啟。
  • 你可以使用它修改配置參數,或者改變Redis的持久化方式。
  • CONFIG SET可以修改的配置參數可以使用命令CONFIG GET *來列出,所有被CONFIG SET修改的配置參數都會立即生效。
  • 當設置成功時返回OK,否則返回一個錯誤。

CONFIG_GET

  • CONFIG GET parameter
  • CONFIG GET命令用於取得運行中的Redis服務器的配置參數。
  • CONFIG GET接受單個參數parameter作為搜索關鍵字,查找所有匹配的配置參數,其中參數和值以”鍵-值對”的方式排列。
  • 比如執行CONFIG GET s*命令,服務器就會返回所有以s開頭的配置參數及參數的值:
    redis> CONFIG GET s*
    1) "save"                       # 參數名:save
    2) "900 1 300 10 60 10000"      # save 參數的值
    3) "slave-serve-stale-data"     # 參數名: slave-serve-stale-data
    4) "yes"                        # slave-serve-stale-data 參數的值
    5) "set-max-intset-entries"     # ...
    6) "512"
    7) "slowlog-log-slower-than"
    8) "1000"
    9) "slowlog-max-len"
    10) "1000"
    
  • 如果你只是尋找特定的某個參數的話,你當然也可以直接指定參數的名字。
  • 使用命令CONFIG GET *,可以列出CONFIG GET命令支持的所有參數。
  • 所有被CONFIG SET所支持的配置參數都可以在配置文件redis.conf中找到,不過CONFIG GET和CONFIG SET使用的格式和redis.conf文件所使用的格式由以下兩點不同:
    • 10kb、2gb這些在配置文件中所使用的儲存單位縮寫,不可以用在CONFIG命令中,CONFIG SET的值只能通過數字值顯式地設定。
    • save選項在redis.conf中是用多行文字儲存的,但在CONFIG GET命令中,它只打印一行文字。
      #以下是 save 選項在 redis.conf 文件中的表示:
      save 900 1
      save 300 10
      save 60 10000
      
      #但是 CONFIG GET 命令的輸出只有一行:
      redis> CONFIG GET save
      1) "save"
      2) "900 1 300 10 60 10000"
      
      • 上面save參數的三個值表示:在900秒內最少有1個key被改動,或者300秒內最少有10個key被改動,又或者60秒內最少有1000個key被改動,以上三個條件隨便滿足一個,就觸發一次保存操作。
  • 返回給定配置參數的值。

CONFIG_RESETSTAT

  • CONFIG RESETSTAT
  • 重置INFO命令中的某些統計數據,包括:
    • Keyspace hits (鍵空間命中次數)
    • Keyspace misses (鍵空間不命中次數)
    • Number of commands processed (執行命令的次數)
    • Number of connections received (連接服務器的次數)
    • Number of expired keys (過期key的數量)
    • Number of rejected connections (被拒絕的連接數量)
    • Latest fork(2) time(最後執行 fork(2) 的時間)
    • The aof_delayed_fsync counter(aof_delayed_fsync 計數器的值)
  • 總是返回OK。

CONFIG_REWRITE

  • 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文件為重寫後的新文件。
  • 返回一個狀態值:如果配置重寫成功則返回OK,失敗則返回一個錯誤。

調試


PING

  • PING
  • 如果連接正常就返回一個PONG,否則返回一個連接錯誤。
  • 通常用於測試與服務器的連接是否仍然生效,或者用於測量延遲值。

ECHO

  • ECHO message
  • 打印一個特定的信息message,測試時使用。
  • 返回message自身。

OBJECT

  • OBJECT subcommand [arguments [arguments]]
  • OBJECT命令允許從內部察看給定key的Redis對象,它通常用在除錯(debugging)或者了解為了節省空間而對key使用特殊編碼的情況。當將Redis用作緩存程序時,你也可以通過OBJECT命令中的信息,決定key的驅逐策略(eviction policies)。
  • OBJECT命令有多個子命令:
    • OBJECT REFCOUNT 返回給定key引用所儲存的值的次數。此命令主要用於除錯。
    • OBJECT ENCODING 返回給定key鎖儲存的值所使用的內部表示(representation)。
    • OBJECT IDLETIME 返回給定key自儲存以來的空閑時間(idle, 沒有被讀取也沒有被寫入),以秒為單位。
  • 對象可以以多種方式編碼:
    • 字符串可以被編碼為raw(一般字符串)或int(為了節約內存,Redis會將字符串表示的64位有符號整數編碼為整數來進行儲存)。
    • 列表可以被編碼為ziplist或linkedlist。ziplist是為節約大小較小的列表空間而作的特殊表示。
    • 集合可以被編碼為intset或者hashtable。intset是只儲存數字的小集合的特殊表示。
    • 哈希表可以編碼為zipmap或者hashtable。zipmap是小哈希表的特殊表示。
    • 有序集合可以被編碼為ziplist或者skiplist格式。ziplist用於表示小的有序集合,而skiplist則用於表示任何大小的有序集合。
  • 假如你做了什麼讓Redis沒辦法再使用節省空間的編碼時(比如將一個只有1個元素的集合擴展為一個有100萬個元素的集合),特殊編碼類型會自動轉換成通用類型。
  • REFCOUNT和IDLETIME返回數字。ENCODING返回相應的編碼類型。

SLOWLOG

  • SLOWLOG subcommand [argument]
  • Slow log是Redis用來記錄查詢執行時間的日誌系統。
  • 查詢執行時間指的是不包括像客戶端響應,發送回復等IO操作,而單單是執行一個查詢命令所耗費的時間。
  • 另外,slow log保存在內存裏面,讀寫速度非常快,因此你可以放心地使用它,不必擔心因為開啟slow log而損害Redis的速度。
  • slow log的行為由兩個配置參數指定,可以通過改寫redis.conf文件或者用CONFIG GET和CONFIG SET命令對它們動態地進行修改。
  • 第一個選項是slowlog-log-slower-than,它決定要對執行時間大於多少微秒的查詢進行記錄。
  • 另一個選項是slowlog-max-len,它決定slow log最多能保存多少條日誌,slow log本身是一個FIFO隊列,當隊列大小超過slowlog-max-len時,最舊的一條日誌將被刪除,而最新的一條日誌加入到slow log,以此類推。
  • 要查看slow log,可以使用SLOWLOG GET或者SLOWLOG GET number命令,前者打印所有slow log,後者只打印指定數量的日誌,最新的日誌會最先被打印。
redis> SLOWLOG GET
1) 1) (integer) 12                      # 唯一性(unique)的日誌標識符
   2) (integer) 1324097834              # 被記錄命令的執行時間點,以 UNIX 時間戳格式表示
   3) (integer) 16                      # 查詢執行時間,以微秒為單位
   4) 1) "CONFIG"                       # 執行的命令,以數組的形式排列
      2) "GET"                          # 這裡完整的命令是 CONFIG GET slowlog-log-slower-than
      3) "slowlog-log-slower-than"

2) 1) (integer) 11
   2) (integer) 1324097825
   3) (integer) 42
   4) 1) "CONFIG"
      2) "GET"
      3) "*"

3) 1) (integer) 10
   2) (integer) 1324097820
   3) (integer) 11
   4) 1) "CONFIG"
      2) "GET"
      3) "slowlog-log-slower-than"

# ...
  • 日誌的唯一 id 只有在 Redis 服務器重啟的時候才會重置,這樣可以避免對日誌的重複處理(比如你可能會想在每次發現新的慢查詢時發郵件通知你)。
  • 使用命令SLOWLOG LEN可以查看當前日誌的數量。
  • 使用命令SLOWLOG RESET可以清空slow log。

MONITOR

  • MONITOR
  • 實時打印出Redis服務器接收到的命令,調試用。
  • 總是返回OK。

DEBUG_OBJECT

  • DEBUG OBJECT key
  • DEBUG OBJECT是一個調試命令,它不應被客戶端所使用,詳見OBJECT命令。
  • 當key存在時,返回有關信息。當key不存在時,返回一個錯誤。

DEBUG SEGFAULT

  • DEBUG SEGFAULT
  • 執行一個不合法的內存訪問從而讓Redis崩潰,僅在開發時用於BUG模擬。
  • 無返回值。

內部命令


MIGRATE

  • 將key原子性地從當前實例傳送到目標實例的指定數據庫上,一旦傳送成功,key保證會出現在目標實例上,而當前實例上的key會被刪除。
  • 這個命令是一個原子操作,它在執行的時候會阻塞進行遷移的兩個實例,直到以下任意結果發生:遷移成功,遷移失敗,等待超時。
  • 命令的內部實現是這樣的:它在當前實例對給定key執行DUMP命令 ,將它序列化,然後傳送到目標實例,目標實例再使用RESTORE對數據進行反序列化,並將反序列化所得的數據添加到數據庫中;當前實例就像目標實例的客戶端那樣,只要看到RESTORE命令返回OK,它就會調用DEL刪除自己數據庫上的key。
  • timeout參數以毫秒為格式,指定當前實例和目標實例進行溝通的最大間隔時間。這說明操作並不一定要在timeout毫秒內完成,只是說數據傳送的時間不能超過這個timeout數。
  • MIGRATE命令需要在給定的時間規定內完成IO操作。如果在傳送數據時發生IO錯誤,或者達到了超時時間,那麼命令會停止執行,並返回一個特殊的錯誤:IOERR。
  • 當IOERR出現時,有以下兩種可能:
    • key可能存在於兩個實例
    • key可能只存在於當前實例
  • 唯一不可能發生的情況就是丟失key,因此,如果一個客戶端執行MIGRATE命令,並且不幸遇上IOERR錯誤,那麼這個客戶端唯一要做的就是檢查自己數據庫上的key是否已經被正確地刪除。
  • 如果有其他錯誤發生,那麼MIGRATE保證key只會出現在當前實例中。(當然,目標實例的給定數據庫上可能有和key同名的鍵,不過這和MIGRATE命令沒有關係)。
  • 可選項:
    • COPY:不移除源實例上的key。
    • REPLACE:替換目標實例上已存在的key。
  • 遷移成功時返回OK,否則返回相應的錯誤。

DUMP

  • DUMP key
  • 序列化給定key,並返回被序列化的值,使用RESTORE命令可以將這個值反序列化為Redis鍵。
  • 序列化生成的值有以下幾個特點:
    • 它帶有64位的校驗和,用於檢測錯誤,RESTORE在進行反序列化之前會先檢查校驗和。
    • 值的編碼格式和RDB文件保持一致。
    • RDB版本會被編碼在序列化值當中,如果因為Redis的版本不同造成RDB格式不兼容,那麼Redis會拒絕對這個值進行反序列化操作。
  • 序列化的值不包括任何生存時間信息。
  • 如果key不存在,那麼返回nil。否則,返回序列化之後的值。

RESTORE

  • RESTORE key ttl serialized-value [REPLACE]
  • 反序列化給定的序列化值,並將它和給定的key關聯。
  • 參數ttl以毫秒為單位為key設置生存時間;如果ttl為0,那麼不設置生存時間。
  • RESTORE在執行反序列化之前會先對序列化值的RDB版本和數據校驗和進行檢查,如果RDB版本不相同或者數據不完整的話,那麼RESTORE會拒絕進行反序列化,並返回一個錯誤。
  • 如果鍵key已經存在,並且給定了REPLACE選項,那麼使用反序列化得出的值來代替鍵key原有的值;相反地,如果鍵key已經存在,但是沒有給定REPLACE選項,那麼命令返回一個錯誤。
  • 如果反序列化成功那麼返回OK,否則返回一個錯誤。

SYNC

  • SYNC
  • 用於複製功能的內部命令。
  • 返回序列化數據。

PSYNC

  • PSYNC master_run_id offset
  • 用於複製功能的內部命令。
  • 返回序列化數據。

博客園地址://www.cnblogs.com/luyuze95/
轉載請註明出處。

Tags: