在Redis 中操作字符串的基本命令

Redis 作為一個流行的key-value 內存數據存儲,由於性能高、數據類型豐富、API 功能強大c助希望在業務場景中交付低延遲服務的用戶。

使用Redis 進行應用設計和開發的一個核心概念是數據類型。與關係數據庫不同,在Redis 中不存在需要我們擔心的表或模式。在使用Redis 進行應用設計和開發時,我們首先應該考慮的是,Redis原生支持的哪種數據類型最適合我們的場景。此外,我們無法像在關係數據庫中那樣,使用SQL 來操作Redis 中的數據。相反,我們需要直接使用API 發送數據所對應的命令,來操作想要操作的目標數據。

字符串類型是編程語言和應用程序中最常見和最有用的數據類型,也是Redis 的基本數據類型之一。事實上,Redis 中所有的鍵都必須是字符串。本案例將演示在Redis 中操作字符串的基本命令。

為了更好地說明,我們將展示一個類似於Yelp 的示例程序(本書中將其稱為Relp)。Relp 是一個供用戶評論和推薦優秀餐廳、購物中心或其他服務的應用。在Relp 中,我們可以瀏覽一個城市中不同的Redis 4.x Cookbook 中文版餐廳,找到在一定距離範圍內排名前十的健身房,給本地服務打分和發表評論意見,等等。我們會把Relp 所涉及的數據全部存儲到Redis 中。

1 準備工作

我們需要按照啟動和停止Redis 一節中的步驟安裝一個Redis 服務器,並使用redis-cli 連接到這個Redis 服務器。

2 操作步驟

接下來,讓我們按照以下的步驟來學習如何使用字符串類型。

1. 打開一個終端,並使用redis-cli 連接到Redis。

2. 使用SET 命令將一個字符串值關聯到一個鍵。在Relp 中,我們可以將餐廳名稱和地址分別用作鍵和值;例如,假設我們想設置“Extreme Pizza”餐廳的地址:

127.0.0.1:6379> SET "Extreme Pizza" "300 Broadway, New York, NY"

OK

3. 使用GET 命令可以輕鬆地取回字符串的值:

127.0.0.1:6379> GET "Extreme Pizza"

"300 Broadway, New York, NY"

4. 當GET 一個不存在的鍵時會返回(nil):

127.0.0.1:6379> GET "Yummy Pizza"

(nil)

5. STRLEN 命令返回字符串的長度;例如,如果我們想獲取“Extreme Pizza”地址的長度,可以使用:

127.0.0.1:6379> STRLEN "Extreme Pizza"

(integer) 26

6. 對不存在的鍵執行STRLEN 命令會返回0。

Redis 還提供了一些命令來直接操作字符串。使用這些命令的好處是,不需要通過GET 命令來讀取一個字符串的值,再用SET 命令將(處理後的)字符串寫回去。

  • 使用APPEND 命令可以向一個鍵的字符串值末尾追加字符串:

127.0.0.1:6379> APPEND "Extreme Pizza" " 10011"

(integer) 32

127.0.0.1:6379> GET "Extreme Pizza"

"300 Broadway, New York, NY 10011"

  • 使用SETRANGE 命令可以覆蓋字符串值的一部分;例如,如果我們想更新“Extreme Pizza”的地址,可以使用:

127.0.0.1:6379> SETRANGE "Extreme Pizza" 14 "Washington, DC 20009"

(integer) 34

127.0.0.1:6379> GET "Extreme Pizza"

"300 Broadway, Washington, DC 20009"

3 工作原理

SET 和GET 可能是Redis 中最常用的命令了。SET 命令的用法非常簡單:

SET

如果SET 命令執行成功,Redis 會返回OK。APPEND 命令會將字符串追加到現有字符串的末尾,並返回新字符串的長度。如果鍵不存在,那麼Redis 將首先創建一個空字符串並與鍵相關聯,然後再執行APPEND 命令。SETRANGE 命令會覆蓋字符串的一部分(從指定的偏移開始,直到整個字符串的末尾)。在Redis 中,字符串的偏移是從0 開始的。SETRANGE 命令會在覆蓋完成後返回新字符串的長度。

4 更多細節

如果某個鍵已經存在,那麼SET 命令會覆蓋該鍵此前對應的值。有時,我們不希望在鍵存在的時候盲目地覆蓋鍵;這時,我們可以使用EXIST 命令來測試鍵的存在性。事實上,Redis 提供了SETNX 命令(簡稱為不存在時SET),用於原子性地、僅在鍵不存在時設置鍵的值。如果鍵的值設置成功,則SETNX 返回1;如果鍵已經存在,則返回0 且不覆蓋原來的值:

127.0.0.1:6379> SETNX "Lobster Palace" "437 Main St, Chicago, IL"

(integer) 1

127.0.0.1:6379> SETNX "Extreme Pizza" "100 Broadway, New York, NY"

(integer) 0

SET 命令中的NX 選項與SETNX 一樣。相反地,SET 命令的XX 選項表示僅在鍵已經存在時才設置值。

我們可以通過使用MSET 和MGET 命令來一次性地設置和獲取多個鍵的值。使用MSET 的優點在於整個操作是原子性的,意味著所有的鍵都是在客戶機和服務器之間的一次通信中設置的。因此,我們可以通過使用MSET 命令而不是發出多個SET 命令來節省網絡開銷。MSET 和MGET 命令的用法為:

MSET key value [key value...]

MGET key value [key value...]

127.0.0.1:6379> MSET "Sakura Sushi" "123 Ellis St, Chicago, IL" "Green Curry

Thai" "456 American Way, Seattle, WA"

OK

127.0.0.1:6379> MGET "Sakura Sushi" "Green Curry Thai" "nonexistent"

1) "123 Ellis St, Chicago, IL"

2) "456 American Way, Seattle, WA"

3) (nil)

在這裡有必要提一下字符串在Redis 內部是如何進行編碼的。Redis 使用了三種不同的編碼方式來存儲字符串對象,並會根據每個字符串值自動決定所使用的編碼方式:

  • int:用於能夠使用64 位有符號整數表示的字符串。

  • embstr:用於長度小於或等於44 字節(在Redis 3.x 中曾經是39 字節)的字符串;這種類型的編碼在內存使用和性能方面更有效率。

  • raw:用於長度大於44 字節的字符串。

我們可以使用OBJECT 命令來查看與鍵相關聯的Redis 值對象的內部編碼方式:

127.0.0.1:6379> SET myKey 12345

OK

127.0.0.1:6379> OBJECT ENCODING myKey

"int"

127.0.0.1:6379> SET myKey "a string"

OK

127.0.0.1:6379> OBJECT ENCODING myKey

"embstr"

127.0.0.1:6379> SET myKey "a long string whose length is more than 44 bytes"

OK

127.0.0.1:6379> OBJECT ENCODING myKey

"raw"

5 相關內容

  • OBJECT 命令除了用於查看編碼外還有更多的功能,該命令還允許我們查看Redis 對象的refcount 和idletime(參見https://redis.io/commands/object)。

  • 受篇幅所限,在本案例中我們無法演示字符串類型相關的所有Redis 命令。請讀者參閱https://redis.io/-commands#string學習字符串相關的所有命令。

本文選自《Redis 4.x Cookbook中文版》

在Redis 中操作字符串的基本命令

Redis實戰案例書!版本全新,隨拿即用,完整運行,從Redis 4.x基本命令實戰、複製、持久化到各種高可用集群方案!

【中】黃鵬程 王左非 著 ,梅隆魁 譯

圖書詳情:https://item.jd.com/12364212.html


分享到:


相關文章: