? 前面我們講解了一些 Redis 的全局命令(Redis常用基本全局命令)。所謂全局命令,就是可以匹配任意一個數據結構進行使用。但是不同的數據結構,也有自己的操作命令。本篇文章主要講解的是 String 的操作命令,希望會對你有所幫助。
文章目錄
一、簡單介紹
二、常用命令
2、1 常見命令
set
get
MGET 和 MSET
SETNX、SETEX
2、2 計數命令
INCR 和 INCRBY
DECR 和 DECRBY
INCRBYFLOAT
2、3 其他命令
APPEND
?GETRANGE
SETRANGE
STRLEN
三、小結
🙋?♂??作者:@Ggggggtm?🙋?♂?
👀?專欄:Redis 👀
💥?標題: Redis命令——String篇 💥
????寄語:與其忙著訴苦,不如低頭趕路,奮路前行,終將遇到一番好風景???
一、簡單介紹
? 我們再次強調:redis 所有的key都是字符串(String)類型,value的類型是存在差異的!而我們本篇文章講解的 String 的命令操作,也是針對 value 的。
??Redis 中的字符串,直接就是按照字節數組(二進制數據)的方式存儲的!不會做任何的編碼轉換,存的是啥,取出來就還是啥!不僅僅可以存儲文本數據,還支持存儲整數、文本、JSON、二進制數據等。
? 字符串類型是Redis最基礎的數據類型,關于字符串需要特別注意:
- 首先Redis 中所有的鍵的類型都是字符串類型,而且其他幾種數據結構也都是在字符串類似基礎上構建的,例如列表和集合的元素類型是字符串類型,所以字符串類型能為其他4種數據結構的學習奠定基礎。
- 其次,如下圖所示,字符串類型的值實際可以是字符串,包含一般格式的字符串或者類似JSON、XML格式的字符串;數字,可以是整型或者浮點型;甚至是二進制流數據,例如圖片、音頻、視頻等。不過一個字符串的最大值不能超過512 MB。
? 由于Redis內部存儲字符串完全是按照二進制流的形式保存的,所以Redis是不處理字符集編碼問題的,客戶端傳入的命令中使用的是什么字符集編碼,就存儲什么字符集編碼。
? 下面我們就來看一下String的操作命令。
二、常用命令
2、1 常見命令
set
? 前面文章中我們講解過set命令的使用。在此我們再次詳細解釋一下 set 命令的使用。首先,get、set都是針對 String 的命令,也是最為重要和基礎的兩個命令!set 語法格式:
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
? 下面是對 set 命令參數的詳細解釋:
- key:指定要設置值的鍵。
- value: 要存儲的值。
- [expiration EX seconds | PX milliseconds]: 可選參數,用于設置鍵的過期時間。可以使用
EX
參數和以秒為單位的時間來設置過期時間,或者使用PX
參數和以毫秒為單位的時間來設置過期時間。過期后會自動刪除!具體實例如下:- [NX|XX]: 可選參數,用于指定設置操作的行為。NX——只在key不存在時才進行設置,即如果key之前已經存在,設置不執行。XX——只在key存在時才進行設置,即如果key之前不存在,設置不執行。具體實例如下:
? 注意,redis文檔給出的語法格式說明:
- [?] 相當于一個獨立的單元,表示可選項(可有可無的);
- 其中 | 表示 "或者" 的意思,多個只能出現一個;
- [ ] 和 [ ] 之間,是可以同時存在的。
get
? get命令沒什么好解釋的,也是只支持字符串(String)類型的value。如果不匹配,則直接會報錯提示。具體如下:
? 語法也很簡單:
get key
? 直接使用即可,這里不再做過多解釋!需要學習的可以參看此篇文章:Redis常用基本全局命令。
MGET 和 MSET
??在Redis中,MGET和MSET是用于批量獲取和設置多個鍵值對的命令。之前我們也說明了Redis是一個基于網絡的客戶端/服務器的中間件。為了減少網絡IO的次數,那么就出現了MGET 和 MSET 指令。類似的Redis都有很多命令都是可以支持一次操作多個鍵值對的。其目的就是為了提高效率。
? 我們先來看一下MGET 命令語法:
MGET key [key ...]
? 理解并不難,我們直接看實例:
? ?我們再來看一下MSET 的語法:
MSET key value [key value ...]
? 我們直接看實例:
? 兩者的時間復雜度均為O(n),這里的 n 并不是指的redis中所有的key,而是我們所設置的key的個數。即使mset 和 mget 指令可以一次操作多個鍵值對,但是并不會一次設置或者獲取 太對的鍵值對。因為我一次設置假設10w個鍵值對,有可能把redis 給阻塞住了!導致其他的命令不能夠被執行,引起連鎖反應!
SETNX、SETEX
? SETNX、SETEX其實就是把set 中的nx 和 ex選項結合成為一個命令了。這里再簡單解釋一下。
? SETNX 命令用于在 Redis 中設置一個 key 的值,如果這個 key 不存在的話。如果設置成功,返回 1;如果 key 已經存在,則不做任何操作,返回 0。具體實例如下:
? SETEX 命令用于在 Redis 中設置一個 key 的值,并指定該 key 在指定的秒數后過期。如果設置成功,返回 OK。這里要說明一下其語法:
SETEX key seconds value
? 我們直接看一個實例:
2、2 計數命令
INCR 和 INCRBY
? 在 Redis 中,INCR 和 INCRBY 命令都用于對存儲在指定 key 中的值進行增量操作。
- INCR 命令用于將存儲在指定 key 的值遞增 1。如果 key 不存在,則先將其設置為 0,然后再執行遞增操作。語法:INCR key。
- INCRBY 命令用于將存儲在指定 key 的值遞增指定的增量值。如果 key 不存在,則先將其設置為 0,然后再執行遞增操作。語法:INCRBY key increment。
? 注意:如果INCR 和 INCRBY key對應的string 不是一個整型或者范圍超過了64位有符號整型,則報錯。我們來看一下實例:
DECR 和 DECRBY
??在 Redis 中,DECR 和 DECRBY 命令與 INCR 和 INCRBY 命令相反,用于對存儲在指定 key 中的值進行減量操作。
- DECR 命令用于將存儲在指定 key 的值遞減 1。如果 key 不存在,則先將其設置為 0,然后再執行遞減操作。語法:DECR key。
- DECRBY 命令用于將存儲在指定 key 的值遞減指定的減量值。如果 key 不存在,則先將其設置為 0,然后再執行遞減操作。語法:DECRBY key decrement。
??注意:如果DECR 和 DECRBY key對應的string 不是一個整型或者范圍超過了64位有符號整型,則報錯。
INCRBYFLOAT
??INCRBYFLOAT是 Redis 中用于對存儲在指定鍵中的浮點數值進行增加或減少操作的命令。下面是關于 INCRBYFLOAT 命令語法:
INCRBYFLOAT key increment
功能描述:
- INCRBYFLOAT?命令用于在指定鍵存儲的值為浮點數時,將這個值增加(或減少)指定的浮點數增量。
- 如果鍵不存在,那么在執行命令前,會先將鍵的值設置為 0,再執行增加操作。
- 如果鍵包含的值不是浮點數,命令將返回錯誤。
- 增量參數可以是正數也可以是負數,用來增加或減少存儲在鍵中的浮點數值。
? 注意:并沒有DECRBYFLOAT,我們可以通過INCRBYFLOAT key 負數 來實現對 key 的減法操作。這里就不再舉例了,大家可以自己操作一下。
2、3 其他命令
APPEND
? append 顧名思義就是追加嘛!如果key已經存在并且是一個string,命令會將value追加到原有string的后邊。如果key不存在,會先將鍵的值設置為空字符串再進行追加操作,則效果等同于SET命令。最終返回值為追加后字符串的長度。其語法如下:
APPEND KEY VALUE
? 具體實例如下:
? 可不可以追加漢字呢?是可以的。具體如下:
??append返回值,長度的單位是字節。但是為什么會是6個字節呢?redis的字符串不會對字符編碼做任何處理(redis 不認識字符,只認識字節)。當前咱們的xshell終端,默認的字符編碼是utf8,在終端中輸入漢字之后,也就是按照utf8編碼的。一個漢字在utf8字符集中通常是3個字節的。
? 我們通過get 獲取value時,發現并不是我們所想的到的漢字,而是一堆二進制。因為存儲進去時,并沒有指定編碼格式,那么存儲的就是二進制,并且是以utf8所對應的編碼方式的二進制存儲進去的。所以我們得到的就是一堆二進制。
??在啟動redis客戶端的時候,加上一個--raw這樣的選項。就可以使redis客戶端能夠自動的把二進制數據嘗試翻譯。具體如下:
?GETRANGE
? GETRANGE 命令用于獲取指定鍵對應值的子字符串(根據指定的起始位置和結束位置)。語法:
GETRANGE key start end
? 返回key對應的string的子串,由start和 end確定(左閉右閉),并且起始位置為0。可以使用負數表示倒數。-1代表倒數第一個字符(len - 1),-2代表倒數第二個(len - 2),其他的與此類似。超過范圍的偏移量會根據string的長度調整成正確的值。具體實例如下:
??
? 如果字符串中保存的是漢字,此時進行子串切分,很可能切出來的就不是完整的漢字了!如下:
??上述的代碼,是強行切出了中間的四個字節。隨便這么一切,切出的結果在utf8碼表上不知道能查出啥了。
SETRANGE
? SETRANGE 命令用于替換指定鍵對應值的字符串中的部分內容。語法:
SETRANGE key offset value
? offset 為偏移量,表示從哪個位置開始替換字符串內容(以 0 表示)。value就是覆蓋指定位置的值。注意:setrange 是用來覆蓋替換的,并不是插入!具體實例如下:
??setrange針對不存在的key也是可以操作的.不過會把 offset之前的內容填充成0x00.具體如下:
STRLEN
??STRLEN 命令用于獲取存儲在指定鍵中的字符串值的長度。當key存儲的value不是string時,直接報錯。或者當 key 不存在時,返回 0。語法:
STRLEN key
? 具體實例如下:
三、小結
? 上述命令總結出如下表格,根據不同場景可以做出不同選擇。具體如下: