Redis系列第二篇之String

Redis為k-v形式的內(nèi)存數(shù)據(jù)庫,其v對應(yīng)多種數(shù)據(jù)結(jié)構(gòu)存儲形式,String就是其中一種,一起來學(xué)習(xí)String的各種命令吧!

APPEND key value

  • 可用版本: v2.0.0開始
  • 時間復(fù)雜度: O(1)
  • 解釋: 如果key早已存在并且存儲類型為字符串,此命令將value附加到該string末尾。如果key不存在,Redis將會創(chuàng)建該key并設(shè)置為空字符串,因此在這種特殊情況下APPENDSET相似。
  • 返回值: Integer(整型),返回附加操作后的字符串長度
  • 時間序列模式
    APPEND命令可以用來創(chuàng)建一個由固定大小的樣品組成的非常緊湊的列表,這樣的列表被稱為時間序列,每當(dāng)一個新的樣品到達(dá)時我們可以用下面的命令來存儲它:
    APPEND timeseries "fixed-size" sample
    訪問時間出列中單獨(dú)的元素并不困難:
    • STRLEN可以用來獲取樣品的數(shù)量
    • GETRANGE允許隨機(jī)訪問元素。如果時間序列具有相關(guān)聯(lián)的時間信息,我們可以輕松的通過GETRANGE與Redis v2.6中可用的Lua腳本引擎相結(jié)合來輕松實(shí)現(xiàn)二進(jìn)制搜索以獲取范圍。
    • SETRANGE可以用來覆蓋一個存在的時間序列
      這種模式的局限性是被強(qiáng)制在append-only操作中,因?yàn)镽edis目前缺少可以裁剪string對象的命令所以沒有辦法將時間序列裁剪為指定大小。然而以這種方式存儲的時間序列的空間效率是顯著的。
      提示:可以根據(jù)當(dāng)前的Unix時間切換到不同的鍵,這樣每個鍵可以只有相對少量的樣本,避免處理非常大的鍵,并使這種模式更友好分布在多個Redis實(shí)例中

DECR key

  • 可用版本: v1.0.0開始
  • 時間復(fù)雜度: O(1)
  • 解釋: 將存儲在key的值減1。如果key不存在,在執(zhí)行操作之前將會被置為0,如果key包含錯誤類型的值或者包含一個不能表示為整數(shù)的值,將會返回錯誤。此操作僅限于64位有符號整數(shù)。
  • 返回值: Integer(整型),返回減法操作后的值

DECRBY key decrement

  • 可用版本: v1.0.0開始
  • 時間復(fù)雜度: O(1)
  • 解釋:DECR命令同為減法操作,不同的是DECR為減一,而DECRBY則是減去指定的變量,如果decrement為負(fù)數(shù),則與INCRBY功能相同。如果key不存在,則在執(zhí)行操作之前會將key置為0,如果key包含錯誤類型的值或者包含一個不能表示為整數(shù)的值,將會返回錯誤。此操作僅限于64位有符號整數(shù)。
  • 返回值: Integer(整型),返回操作后的值

GET key

  • 可用版本: v1.0.0開始
  • 時間復(fù)雜度: O(1)
  • 解釋: 獲取key對應(yīng)的value,如果key不存在將會返回nil。GET只能操作string類型,如果key存儲的不是string類型,命令將會返回錯誤。
  • 返回值: Bulk String(批量字符串),返回key對應(yīng)的value,如果key不存在將會返回nil。

GETDEL key

  • 可用版本: v6.2.0開始
  • 時間復(fù)雜度: O(1)
  • 解釋: 獲取key對應(yīng)的值并且刪除key(只能操作于string類型)
  • 返回值: Bulk String(批量字符串),如果key不存在返回nil。如果key不是string類型,返回錯誤。

GETEX key [ EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | PERSIST]

  • 可用版本: v6.2.0開始
  • 時間復(fù)雜度: O(1)
  • 解釋: 獲取key的值,同時可以選擇設(shè)置key的有效期。
  • 選項(xiàng)說明:
    • EX 以秒為單位設(shè)置key的有效期
    • PX 以毫秒為單位設(shè)置key的有效期
    • EXAT 將有效期設(shè)置為精確到秒的時間戳
    • PXAT 將有效期設(shè)置為精確到毫秒的時間戳
    • PERSIST 移除相關(guān)聯(lián)的key的有效期
  • 返回值: Bulk String(批量字符串),key不存在返回nil,否則返回key對應(yīng)的value

GETRANGE key start end

  • 可用版本: v2.4.0開始
  • 時間復(fù)雜度: O(N),其中N為返回字符串的長度。
  • 解釋: 返回存儲在key中字符串的子串,子串由偏移量startend組成的閉區(qū)間決定,如果偏移量為負(fù)數(shù),表示從字符串的結(jié)尾開始便宜:-1表示最后一個字符,-2表示倒數(shù)第二個字符等。如果偏移量超出字符串長度范圍,則將會被限制在字符串長度范圍內(nèi)。
  • 返回值: Bulk String(批量字符串)

GETSET key value

  • 可用版本: v1.0.0開始,從v6.2.0開始,此命令被視為廢棄,可以被帶有GET選項(xiàng)的SET命令替代
  • 時間復(fù)雜度: O(1)
  • 解釋: 設(shè)置key的值的同時返回key存儲的舊值。如果key持有的不是string類型將會返回錯誤。SET成功后,key之前所有的有效期將會被丟棄。
  • 設(shè)計(jì)模式: GETSET可以與INCR一起用于原子復(fù)位計(jì)數(shù)。比如:當(dāng)有程序檢測到有事件發(fā)生時,可以調(diào)用INCR命令,如果需要獲取并重置計(jì)數(shù)器的值時,可以調(diào)用GETSET命令。
  • 返回值: Bulk String(批量字符串),返回存儲在key中的舊值或者nil(當(dāng)key不存在時)。

INCR key

  • 可用版本: v1.0.0開始
  • 時間復(fù)雜度: O(1)
  • 解釋: 將存儲在key中的值加1,如果key不存在則命令在執(zhí)行操作前會先將key的值置為0。如果key持有的數(shù)據(jù)類型不是string或者無法表示為一個整數(shù)時將會返回錯誤。同時此命令被限制在操作64位有符號整數(shù)范圍內(nèi)。
  • 返回值: Integer(整型),返回加1操作后的值

INCRBY key increment

  • 可用版本: v1.0.0開始
  • 時間復(fù)雜度: O(1)
  • 解釋: 此命令與INCR相似,不同之處在于此命令將由調(diào)用者指定增量,如果增量為1,則與INCR命令功能一樣。
  • 返回值: Integer(整型),返回加法操作后的值

INCRBYFLOAT key increment

  • 可用版本: v2.6.0開始
  • 時間復(fù)雜度: O(1)
  • 解釋: 與命令INCRBY key increment相似,不同的是此命令增量可以設(shè)置為雙精度浮點(diǎn)數(shù)(float),如果增量被指定為負(fù)數(shù),則表示減法(默認(rèn)加法操作)。如果key不存在,則命令在執(zhí)行操作之前將會把key置為0,如果發(fā)生以下情況之一,將會返回錯誤:
    • key持有的錯誤類型的值(非string類型)
    • key當(dāng)前持有的值或者指定的增量(increment)無法被解析為雙精度浮點(diǎn)類型
      字符串鍵中已經(jīng)包含的值和增量參數(shù)都可以選擇以指數(shù)表示法提供,但是增量后計(jì)算的值始終以相同的格式存儲:一個整數(shù)后跟(如果需要)一個點(diǎn),以及表示數(shù)字的小數(shù)部分的可變位數(shù)。始終刪除尾隨零,無論計(jì)算的實(shí)際內(nèi)部精度如何,輸出的精度都固定在小數(shù)點(diǎn)后17位。
  • 返回值: Bulk String(批量字符串),返回命令執(zhí)行操作后key所持有的值

LCS key1 key2 [LEN] [IDX] [MINMATCHLEN len] [WITHMATCHLEN]

  • 可用版本: v7.0.0開始
  • 時間復(fù)雜度: O(N*M),其中N為s1的長度,M為s2的長度
  • 解釋: LCS命令實(shí)現(xiàn)最長公共子序列算法,與最長公共字符串算法不同的是,最長公共子序列算法在字符串中匹配的字符不需要是連續(xù)的,例如字符串faofo的最長公共子序列結(jié)果為fo。LCS命令在計(jì)算兩個字符串有多相似時是非常有用的,比如計(jì)算DNA序列的相似程度。
  • 選項(xiàng)說明:
    • LEN 返回匹配結(jié)果的長度
    • IDX 返回每個匹配結(jié)果的匹配位置
    • MINMATCHLEN 限制匹配列表的最小長度
    • WITHMATCHLENIDX搭配使用,同時返回匹配長度
  • 返回值:
    • 沒有指定修飾符:返回表示匹配到的最長子序列的Bulk String(批量字符串)
    • 如果指定了LEN修飾符將會返回最長子序列的長度
    • 如果指定了IDX修飾符,將會返回一個數(shù)組,其中包含LCS長度和兩個字符串(s1,s2)中的所有范圍、每個字符串的開始和結(jié)束偏移量,其中有匹配項(xiàng)。當(dāng)給定 WITHMATCHLEN 時,表示匹配的每個數(shù)組也將具有匹配的長度

MGET key [key ...]

  • 可用版本: v1.0.0開始
  • 時間復(fù)雜度: O(N),N為給定key的數(shù)量
  • 解釋: 返回指定key(s)的值,對于不存在的key或者持有值不是string的key,將會返回nil,命令總是成功。
  • 返回值: Array(數(shù)組),返回由指定key(s )的值組成的數(shù)組

MSET key value [ key value ...]

  • 可用版本: v1.0.1開始
  • 時間復(fù)雜度: O(N),N為key的數(shù)量
  • 解釋: 批量設(shè)置key-value鍵值對。如果key存在,命令將會用新值替換key的舊值,MSET操作是原子性的。
  • 返回值: Simple String(簡單字符串),命令總是返回OK。

MSETNX key value [ key value ...]

  • 可用版本: v1.0.1開始
  • 時間復(fù)雜度: O(N),N為key的數(shù)量
  • 解釋:MSET功能一樣,批量設(shè)置key-value鍵值對,不同的是如果指定的key已經(jīng)存在MSETNX不會對于該key不會執(zhí)行任何操作。同樣,MSETNX也是原子性的
  • 返回值: Integer(整型)
    • 如果所有給定的key都被設(shè)置了則返回1
    • 如果沒有key被設(shè)置則返回0

PSETEX key milliseconds value

  • 可用版本: v2.6.0開始
  • 時間復(fù)雜度: O(1)
  • 解釋: 以毫秒為單位設(shè)置key的有效期
  • 返回值: Simple String(簡單字符串),返回OK

SET key value [ NX | XX] [GET] [ EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]

  • 可用版本: v1.0.0開始
  • 歷史:
    • v2.6.12開始支持EX,PXNXXX選項(xiàng)
    • v6.0.0開始支持KEEPTTL選項(xiàng)
    • v6.2.0開始支持GET,EXATPXAT選項(xiàng)
    • v7.0.0開始支持NXGET一起使用
  • 時間復(fù)雜度: O(1)
  • 解釋: 將key設(shè)置為字符串value,如果key早已存在,無論舊值類型是什么,命令都將會覆蓋舊值。執(zhí)行操作之前的任何有效期都會被丟棄。
  • 選項(xiàng)說明:
    • EX 以秒為單位設(shè)置key的有效期為多少秒
    • PX 以毫秒為單位設(shè)置key的有效期為多少毫秒
    • EXAT 將key的有效截止時間點(diǎn)設(shè)置為精確到秒的時間戳
    • PXAT 將key的有效截止時間點(diǎn)設(shè)置為精確到毫秒的時間戳
    • NX 只有當(dāng)key不存在時才設(shè)置
    • XX 只有當(dāng)key已經(jīng)存在時才設(shè)置
    • KEEPTTL 保留key既有的有效期
    • GET 返回key的舊值,如果key不存在則返回nil。如果key所持有的的舊值不是string類型,則終止SET操作。
  • 返回值:
    • Simple String(簡單字符串):如果SET正確執(zhí)行將返回OK
    • Null Reply(nil): 如果用戶指定了NX或者XX選項(xiàng),并且SET操作沒有被執(zhí)行則返回nil
      如果調(diào)用方指定了GET選項(xiàng),將會以下面兩種形式返回(無論SET命令是否執(zhí)行):
    • Bulk String(批量字符串):如果key存在,返回key對應(yīng)的舊值
    • Null Reply(nil):如果key不存在返回nil
  • 模式: 命令SET resource-name anystring NX EX max-lock-time是使用Redis實(shí)現(xiàn)鎖的一種簡單方式。客戶端可以通過上述命令返回的OK獲得鎖(或者當(dāng)返回nil時過一段時間再重試),并且通過命令DEL移除鎖。
    當(dāng)有效期到達(dá)后鎖將自動釋放??梢酝ㄟ^以下兩點(diǎn)來使鎖系統(tǒng)更加健壯:
    • 設(shè)置隨機(jī)字符串(Token)而不是設(shè)置固定字符串
    • 通過腳本當(dāng)Token匹配時才刪除key而不是簡單的通過DEL命令移除鎖
      上述兩點(diǎn)避免了當(dāng)鎖過期后,客戶端再次嘗試釋放另一個客戶端創(chuàng)建的鎖。

SETEX key seconds value

  • 可用版本: v2.0.0開始
  • 時間復(fù)雜度: O(1)
  • 解釋: 將key的值設(shè)置為字符串value,同時設(shè)置key的有效期為指定的秒數(shù),如果秒數(shù)不可用將會返回錯誤。SETEX是原子操作。
  • 返回值: Simple String(簡單字符串)

SETNX key value

  • 可用版本: v1.0.0開始
  • 時間復(fù)雜度: O(1)
  • 解釋: 如果key不存在則將key的值設(shè)置為字符串value,如果key早已存在則不執(zhí)行任何操作。
  • 返回值: Integer(整型)
    • 如果key被設(shè)置了返回1
    • 如果key沒被設(shè)置返回0

SETRANGE key offset value

  • 可用版本: v2.2.0開始
  • 時間復(fù)雜度: 如果字符串很小,不計(jì)算拷貝字符串帶來的開銷時時間復(fù)雜度為O(1),否則時間復(fù)雜度為O(M),M為value的長度
  • 解釋: 從指定offset開始到結(jié)尾的覆蓋key持有的字符串值,如果offset大于key持有字符串的當(dāng)前長度,則用零字節(jié)填充字符串以使offset適合,不存在的鍵被視為空字符串,因此此命令將確保它包含足夠大的字符串以能夠在偏移量處設(shè)置值。
    注意,offset可以設(shè)置的最大值為2^29-1(536870911),因?yàn)镽edis字符串類型最大長度為512MB,如果需要增長超過這個限制,可以使用多個key。
  • 返回值: Integer(整型),返回命令執(zhí)行后key持有的字符串的長度。

STRLEN key

  • 可用版本: v2.2.0開始
  • 時間復(fù)雜度: O(1)
  • 解釋: 返回key持有的字符串的長度,如果value不是字符串類型,則返回錯誤
  • 返回值: Integer(整型),返回key對應(yīng)字符串的長度,如果key不存在則返回0

SUBSTR key start end

  • 可用版本: v1.0.0開始,從Redis v2.0.0開始此命令被視為廢棄
  • 時間復(fù)雜度: O(N),其中N為返回的字符串的長度
  • 解釋: 返回key持有的字符串值的子串,子串由startend決定組成的閉區(qū)間決定,負(fù)數(shù)的偏移量表示從字符串尾部開始計(jì)算偏移量,如-1表示字符串最后一個字符。
  • 返回值: Bulk String(批量字符串),返回子串

參考資料

Redis String

原文連接

Redis系列第二篇之String

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容