Redis 字串物件

2022-07-08 10:18:10 字數 3720 閱讀 8736

字串物件的編碼可以是intraw或者embstr

如果乙個字串物件儲存的是整數值, 並且這個整數值可以用long型別來表示, 那麼字串物件會將整數值儲存在字串物件結構的ptr屬性裡面(將void*轉換成long), 並將字串物件的編碼設定為int

舉個例子, 如果我們執行以下 set 命令, 那麼伺服器將建立乙個如圖 8-1 所示的int編碼的字串物件作為number鍵的值:

如果字串物件儲存的是乙個字串值, 並且這個字串值的長度大於39位元組, 那麼字串物件將使用乙個簡單動態字串(sds)來儲存這個字串值, 並將物件的編碼設定為raw

舉個例子, 如果我們執行以下命令, 那麼伺服器將建立乙個如圖 8-2 所示的raw編碼的字串物件作為story鍵的值:

如果字串物件儲存的是乙個字串值, 並且這個字串值的長度小於等於39位元組, 那麼字串物件將使用embstr編碼的方式來儲存這個字串值。

embstr編碼是專門用於儲存短字串的一種優化編碼方式, 這種編碼和raw編碼一樣, 都使用redisobject結構和sdshdr結構來表示字串物件, 但raw編碼會呼叫兩次記憶體分配函式來分別建立redisobject結構和sdshdr結構, 而embstr編碼則通過呼叫一次記憶體分配函式來分配一塊連續的空間, 空間中依次包含redisobjectsdshdr兩個結構, 如圖 8-3 所示。

embstr編碼的字串物件在執行命令時, 產生的效果和raw編碼的字串物件執行命令時產生的效果是相同的, 但使用embstr編碼的字串物件來儲存短字串值有以下好處:

embstr編碼將建立字串物件所需的記憶體分配次數從raw編碼的兩次降低為一次。

釋放embstr編碼的字串物件只需要呼叫一次記憶體釋放函式, 而釋放raw編碼的字串物件需要呼叫兩次記憶體釋放函式。

因為embstr編碼的字串物件的所有資料都儲存在一塊連續的記憶體裡面, 所以這種編碼的字串物件比起raw編碼的字串物件能夠更好地利用快取帶來的優勢。

作為例子, 以下命令建立了乙個embstr編碼的字串物件作為msg鍵的值, 值物件的樣子如圖 8-4 所示:

最後要說的是, 可以用long double型別表示的浮點數在 redis 中也是作為字串值來儲存的: 如果我們要儲存乙個浮點數到字串物件裡面, 那麼程式會先將這個浮點數轉換成字串值, 然後再儲存起轉換所得的字串值。

舉個例子, 執行以下**將建立乙個包含3.14的字串表示"3.14"的字串物件:

redis> set pi 3.14

okredis>object encoding pi

"embstr

"

在有需要的時候, 程式會將儲存在字串物件裡面的字串值轉換回浮點數值, 執行某些操作, 然後再將執行操作所得的浮點數值轉換回字串值, 並繼續儲存在字串物件裡面。

舉個例子, 如果我們執行以下**的話:

redis> incrbyfloat pi 2.0

"5.14

"redis>object encoding pi

"embstr

"

int編碼的字串物件和embstr編碼的字串物件在條件滿足的情況下, 會被轉換為raw編碼的字串物件。

對於int編碼的字串物件來說, 如果我們向物件執行了一些命令, 使得這個物件儲存的不再是整數值, 而是乙個字串值, 那麼字串物件的編碼將從int變為raw

redis> set number 10086

okredis>object encoding number

"int

"is a good number!

"(integer)

23redis>get number

"10086 is a good number!

"redis>object encoding number

"raw

"

另外, 因為 redis 沒有為embstr編碼的字串物件編寫任何相應的修改程式 (只有int編碼的字串物件和raw編碼的字串物件有這些程式), 所以embstr編碼的字串物件實際上是唯讀的: 當我們對embstr編碼的字串物件執行任何修改命令時, 程式會先將物件的編碼從embstr轉換成raw, 然後再執行修改命令; 因為這個原因,embstr編碼的字串物件在執行修改命令之後, 總會變成乙個raw編碼的字串物件。

redis> set msg "

hello world"ok

redis>object encoding msg

"embstr

"again!

"(integer)

18redis>object encoding msg

"raw

"

Redis 物件 字串物件

之前介紹了多種資料結構 字串 鍊錶 字典 跳表 壓縮列表 整數集合 接下來 介紹 這些資料結構在 redis物件中的使用以及變化 redis物件系統 包括 字串物件 列表物件 雜湊物件 集合物件 有序集合物件 物件使用了至少1種以上的資料結構,並且在條件發生變化時會進行資料結構的改變 其物件實現了基...

字串物件python int 字串 字串物件

最近研究字串物件,稍微總結一下,以後繼續補充 如果我們須要把python的字串物件轉換為數整物件,我們須要用到int方法。比如 ainfo 222 print int ainfo 輸出的結果是222。然後我們檢視下ainfo在現的型別,通過type方法檢視下,發現是 而如果ainfo fefew22...

字串物件

對一直字串進行操作 var str life is a foreign language all men mispronounce it 測試長度 str.length 為字串新增樣式 var txt hello world document.write big txt.big document.w...