@一、簡介

字符串類型的值實際可以是字符串,包含⼀般格式的字符串或者類似 JSON、XML 格式的字符串;數字,可以是整型或者浮點型;甚⾄是⼆進制流數據,例如圖⽚、⾳頻、視頻等。不過⼀個字符串的最⼤值不能超過 512 MB。

Redis 內部存儲字符串完全是按照⼆進制流的形式保存的,所以 Redis 是不處理字符集編碼問題的,客⼾端傳⼊的命令中使⽤的是什麼字符集編碼,就存儲什麼字符集編碼。

二、相關命令

2.1 set 和 get

set key value [expiration EX seconds | PX milliseconds] [NX | XX] 不加 nx 或 xx 選項的 set 命令,如果key不存在,創建新的鍵值對。如果key存在,將會覆蓋已存在的鍵值對,所有屬性都會覆蓋成新創建的鍵值對。 時間複雜度:O(1)

set 命令⽀持多種選項來影響它的⾏為:

  • EX seconds:使⽤秒作為單位設置 key 的過期時間。setex命令可以替代。
  • PX milliseconds:使⽤毫秒作為單位設置 key 的過期時間。psetex命令可以替代。
  • NX :只在 key 不存在時才進⾏設置,即如果 key 之前已經存在,設置不執⾏。setnx命令可以替代。
  • XX :只在 key 存在時才進⾏設置,即如果 key 之前不存在,設置不執⾏。

返回值:

  • 如果設置成功,返回 OK。
  • 如果由於 set 指定了 NX 或者 XX 但條件不滿⾜,set 不會執⾏,並返回 (nil)。

get key 獲取 key 對應的 value。如果 key 不存在,返回 (nil)。如果 value 的數據類型不是 string,會報錯。 時間複雜度:O(1)

返回值:key 對應的 value,或者(nil)當 key 不存在。

2.2 mset 和 mget

mget:⼀次性獲取多個 key 的值。如果對應的 key 不存在或者對應的數據類型不是 string,返回(nil)。

語法: MGET key [key ...]

時間複雜度:O(N) N 是 key 數量 返回值:對應 value 的列表

多次 get 與 單次 mget 對比:

mset: ⼀次性設置多個 key 的值。

語法: mset key value [key value ...]

時間複雜度:O(N) N 是 key 數量 返回值:永遠是 OK

2.3 setnx 和 setex 和 psetex

setnx:設置 key-value 但只允許在 key 之前不存在的情況下才成功。

語法: setnx key value

時間複雜度:O(1)

返回值:1 表⽰設置成功。0 表⽰沒有設置。

set、set NX / setnx、set XX執⾏流程:

setex:設置 key-value 過期時間,秒級

語法: setex key seconds value

時間複雜度:O(1) 返回值:OK 表⽰設置成功。

psetex:設置 key-value 過期時間,毫秒級

語法: psetex key milliseconds value

時間複雜度:O(1) 返回值:OK 表⽰設置成功。

2.4 incre 和 incrby

incr :將 key 對應的 string 表⽰的數字加⼀。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的 string 不是⼀個整型或者範圍超過了 64 位有符號整型,則報錯。

語法: incr key

時間複雜度:O(1)

返回值:integer 類型的加完後的數值。

incrby :將 key 對應的 string 表⽰的數字加對應值。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的 string 不是⼀個整型或者範圍超過了 64 位有符號整型,則報錯。

語法: incrby key decrement

時間複雜度:O(1)

返回值:integer 類型的加完後的數值。

2.5 decr 和 decrby 和 incrbyfloat

decr :將 key 對應的 string 表⽰的數字減⼀。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的 string 不是⼀個整型或者範圍超過了 64 位有符號整型,則報錯。

語法: decr key

時間複雜度:O(1)

返回值:integer 類型的加完後的數值。

decrby :將 key 對應的 string 表⽰的數字減對應值。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的 string 不是⼀個整型或者範圍超過了 64 位有符號整型,則報錯。

語法: decrby key decrement

時間複雜度:O(1)

返回值:integer 類型的加完後的數值。

incrbyfloat: 將 key 對應的 string 表⽰的浮點數加上對應的值。如果對應的值是負數,則視為減去對應的值。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的不是 string,或者不是⼀個浮點數,則報錯。允許採⽤科學計數法表⽰浮點數。

語法: incrbyfloat key increment

命令有效版本:2.6.0 之後 時間複雜度:O(1)

返回值:加/減完後的數值。

2.5 append

append:如果 key 已經存在並且是⼀個 string,命令會將 value 追加到原有 string 的後邊。如果 key 不存在,則效果等同於 set 命令。

語法: append key value 命令有效版本:2.0.0 之後

時間複雜度:O(1). 追加的字符串⼀般⻓度較短, 可以視為 O(1). 返回值:追加完成之後 string 的⻓度,單位是字節。

2.6 getrange

getrange返回 key 對應的 string 的⼦串,由 start 和 end 確定(左閉右閉)。可以使⽤負數表⽰倒數。-1 代表倒數第⼀個字符,-2 代表倒數第⼆個,其他的與此類似。超過範圍的偏移量會根據 string 的⻓度調整成正確的值。長度是字節數,直接操作漢字得到的結果可能不如意。

語法: getrange key start end 命令有效版本:2.4.0 之後 時間複雜度:O(N). N 為 [start, end] 區間的⻓度. 由於 string 通常⽐較短, 可以視為是 O(1)

返回值:string 類型的⼦串

2.7 setrange

setrange :覆蓋字符串的⼀部分,從指定的偏移開始,不存在的key會把offset之前的內容填充為0x00。 語法: setrange key offset value

命令有效版本:2.2.0 之後 時間複雜度:O(N), N 為 value 的⻓度,字節為單位. 由於⼀般給的 value ⽐較短, 通常視為 O(1).

返回值:替換後的 string 的⻓度。

2.8 strlen

strlen:獲取 key 對應的 string 的⻓度。當 key 存放的類型不是 string 時,報錯。

語法: strlen key

命令有效版本:2.2.0 之後 時間複雜度:O(1)

返回值:string 的⻓度,字節為單位。或者當 key 不存在時,返回 0。

2.9 小結

命令

執⾏效果

時間複雜度

set key value [key value...]

設置 key 的值是 value

O(k), k 是鍵個數

get key

獲取 key 的值

O(1)

del key [key ...]

刪除指定的 key

O(k), k 是鍵個數

mset key value [key value...]

批量設置指定的 key 和 value

O(k), k 是鍵個數

mget key [key ...]

批量獲取 key 的值

O(k), k 是鍵個數

incr key

指定的 key 的值 +1

O(1)

decr key

指定的 key 的值 -1

O(1)

incrby key n

指定的 key 的值 +n

O(1)

decrby key n

指定的 key 的值 -n

O(1)

incrbyfloat key n

指定的 key 的值 +n

O(1)

append key value

指定的 key 的值追加 value

O(1)

strlen key

獲取指定 key 的值的⻓度

O(1)

setrange key offset value

覆蓋指定 key 的從 offset 開始的部分值

O(n),n 是字符串⻓度, 通常視為 O(1)

getrange key start end

獲取指定 key 的從 start 到 end 的部分值

O(n),n 是字符串⻓度, 通常視為 O(1)

三、編碼方式

字符串類型的內部編碼有 3 種:

  • int:8 個字節的⻓整型。
  • embstr:⼩於等於 39 個字節的字符串。
  • raw:⼤於 39 個字節的字符串。

Redis 會根據當前值的類型和⻓度動態決定使⽤哪種內部編碼實現。

四、應用場景

4.1 緩存(Cache)功能

Redis 作為緩衝層,MySQL 作為存儲層,絕⼤部分請求的數據都是從 Redis 中獲取。由於 Redis 具有⽀撐⾼併發的特性,所以緩存通常能起到加速讀寫和降低後端壓⼒的作⽤。

4.2 計數(Counter)功能

使⽤ Redis 作為計數的基礎⼯具,它可以實現快速計數、查詢緩存的功能,同時數據可以異步處理或者落地到其他數據源。

4.3 共享會話(Session)

使⽤ Redis 將⽤⼾的 Session 信息進⾏集中管理,在這種模式下,只要保證 Redis 是⾼可⽤和可擴展性的,⽆論⽤⼾被均衡到哪台 Web 服務器上,都集中從 Redis 中查詢、更新 Session 信息。

4.4 短信驗證碼

Redis 中將手機驗證碼存起來,設置過期時間,達到驗證碼失效。