Redis命令手冊

2022-08-10 21:00:51

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
  • 用於複製功能的內部命令。
  • 返回序列化資料。

部落格園地址:https://www.cnblogs.com/luyuze95/
轉載請註明出處。