@一、簡介
字符串類型的值實際可以是字符串,包含⼀般格式的字符串或者類似 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 中將手機驗證碼存起來,設置過期時間,達到驗證碼失效。