字元串(string)鍵是Redis最基本的鍵值對類型,這種類型的鍵值對會在資料庫中把單獨的一個鍵和單獨的一個值關聯起來,被關聯的鍵和值既可以是普通的文字資料,也可以是圖檔、視訊、音頻、壓縮檔案等更為複雜的二進制資料。需要注意的是通常情況下我們很少把多媒體檔案存儲在Redis中。
Redis為字元串鍵提供了一系列操作指令,通過使用這些指令,使用者可以:
- 為字元串鍵設定值。
- 擷取字元串鍵的值。
- 在擷取舊值的同時為字元串鍵設定新值。
- 同時為多個字元串鍵設定值,或者同時擷取多個字元串鍵的值。
- 擷取字元串值的長度。
- 擷取字元串值指定索引範圍内的内容,或者對字元串值指定索引範圍内的内容進行修改。
- 将一些内容追加到字元串值的末尾。
- 對字元串鍵存儲的整數值或者浮點數值執行加法操作或減法操作。
- 接下來将對以上提到的字元串鍵指令進行介紹,并示範如何使用這些指令去解決各種實際問題。
set:為字元串鍵設定值
建立字元串鍵最常用的方法就是使用SET指令,這個指令可以為一個字元串鍵設定相應的值。在最基本的情況下,使用者隻需要向SET指令提供一個鍵和一個值就可以了:
SET key value
注意:Redis指令不需求大小寫,但是鍵值對區分大小寫
與之前提到過的一樣,這裡的鍵和值既可以是文字也可以是二進制資料。SET指令在成功建立字元串鍵之後将傳回OK作為結果。比如通過執行以下指令,我們可以建立出一個字元串鍵,它的鍵為"number",值為"10086":
redis> SET number "10086"
OK
再比如,通過執行以下指令,我們可以建立出一個鍵為"book",值為"The Design and Implementation of Redis"的字元串鍵:
redis> SET book "The Design and Implementation of Redis"
OK
在預設情況下,對一個已經設定了值的字元串鍵執行SET指令将導緻鍵的舊值被新值覆寫。舉個例子,如果我們連續執行以下兩條SET指令,那麼第一條SET指令設定的值将被第二條SET指令設定的值所覆寫:
redis> SET user "admin"
OK
reids> SET user "Jack"
OK
在第二條SET指令執行完畢之後,user鍵的值将從原來的"admin"變為"Jack"。
從Redis 2.6.12版本開始,使用者可以通過向SET指令提供可選的NX選項或者XX選項來訓示SET指令是否要覆寫一個已經存在的值:
SET key value [NX/XX]
如果使用者在執行SET指令時給定了NX選項,那麼SET指令隻會在鍵沒有值的情況下執行設定操作,并傳回OK表示設定成功;如果鍵已經存在,那麼SET指令将放棄執行設定操作,并傳回空值nil表示設定失敗。
以下代碼展示了帶有NX選項的SET指令的行為:
redis> SET password "123456" NX
OK -- 對尚未有值的password鍵進行設定,成功
redis> SET password "999999" NX
(nil) -- password鍵已經有了值,設定失敗
因為第二條SET指令沒有改變password鍵的值,是以password鍵的值仍然是剛開始時設定的"123456"。
如果使用者在執行SET指令時給定了XX選項,那麼SET指令隻會在鍵已經有值的情況下執行設定操作,并傳回OK表示設定成功;如果給定的鍵并沒有值,那麼SET指令将放棄執行設定操作,并傳回空值表示設定失敗。
如果我們對一個沒有值的鍵mongodb-homepage執行以下SET指令,那麼指令将因為XX選項的作用而放棄執行設定操作:
redis> SET mongodb-homepage "mongodb.com" XX
(nil)
相反,如果我們對一個已經有值的鍵執行帶有XX選項的SET指令,那麼指令将使用新值去覆寫已有的舊值:
redis> SET mysql-homepage "mysql.org"
OK -- 為鍵mysql-homepage設定一個值
redis> SET mysql-homepage "mysql.com" XX
OK -- 對鍵的值進行更新
在第二條SET指令執行之後,mysql-homepage鍵的值将從原來的"mysql.org"更新為"mysql.com"。
GET:擷取字元串鍵的值
使用者可以使用GET指令從資料庫中擷取指定字元串鍵的值:
GET KEY
GET指令接受一個字元串鍵作為參數,然後傳回與該鍵相關聯的值。以上一小節中的資料為例:
redis>GET number
“10086”
redis>GET password
"123456"
另外,如果使用者給定的字元串鍵在資料庫中并沒有與之相關聯的值,那麼GET指令将傳回一個空值:
redis>get name
(nil)
上面這個GET指令的執行結果表示資料庫中并不存在date鍵,也沒有與之相關聯的值。
因為Redis的資料庫要求所有鍵必須擁有與之相關聯的值,是以如果一個鍵有值,那麼我們就說這個鍵存在于資料庫;相反,如果一個鍵沒有值,那麼我們就說這個鍵不存在于資料庫。