主頁 > 資料庫 > Redis命令手冊

Redis命令手冊

2022-08-11 13:27:30 資料庫

Redis命令手冊

目錄
  • Redis命令手冊
    • 字串
    • 哈希表
    • 串列
    • 集合
    • 有序集合
    • 資料庫
    • 自動過期
    • 事務
    • HyperLogLog
    • 地理位置
    • 位圖
    • 持久化
    • 發布與訂閱
    • 復制
    • 客戶端與服務器
    • 配置選項
    • 除錯
    • 內部命令

字串


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/
轉載請注明出處,

寧靜致遠,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/501555.html

標籤:其他

上一篇:Redis 持久化機制

下一篇:(Nosql)列式存盤是什么?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more