04 Redis的記憶體物件及內部編碼 String

2021-10-04 10:00:44 字數 1880 閱讀 4203

redis支援5種物件型別,而每種都至少有兩種編碼,這樣做的好處在於:

一方面介面與實現分離,當需要增加或改變內部編碼時,使用者使用不受影響;另一方面可以根據不同的應用場景切換內部編碼,提高效率。

redis各種物件型別支援的內部編碼如下圖所示(部分)

關於redis內部編碼的轉換,都符合以下規律:編碼轉換在redis寫入資料時完成,且轉換過程不可逆,只能從小記憶體編碼向大記憶體編碼轉換。

1.1 概況字串是最基礎的型別,因為所有的鍵都是字串型別,且字串之外的其他幾種複雜型別的元素也是字串。

字串長度不能超過512mb。

1.2 內部編碼字串型別的內部編碼有3種,它們的應用場景如下:

127.0.0.1:6379>

set key1 123

ok127.0.0.1:6379> object encoding key1

"int"

127.0.0.1:6379>

set key2 helloworld

ok127.0.0.1:6379> object encoding key2

"embstr"

127.0.0.1:6379>

set key2 helloworldhelloworldhelloworldhelloworld

ok127.0.0.1:6379> strlen key2

(integer) 40

127.0.0.1:6379> object encoding key2

"embstr"

127.0.0.1:6379>

set key3 helloworldhelloworldhelloworldhelloworldhell

ok127.0.0.1:6379> strlen key3

(integer) 44

127.0.0.1:6379> object encoding key3

"embstr"

127.0.0.1:6379>

set key4 helloworldhelloworldhelloworldhelloworldhello

ok127.0.0.1:6379> strlen key4

(integer) 45

127.0.0.1:6379> object encoding key4

"raw"

1.3 編碼轉換當int資料不再是整數,或大小超過了long的範圍時,自動轉化為raw。

而對於embstr,由於其實現是唯讀的,因此在對embstr物件進行修改時,都會先轉化為raw再進行修改

因此,只要是修改embstr物件,修改後的物件一定是raw的,無論是否達到了44個位元組。

127.0.0.1:6379>

set key1 hello

ok127.0.0.1:6379> object encoding key1

"embstr"

(integer) 11

127.0.0.1:6379> get key1

"hello.world"

127.0.0.1:6379> object encoding key1

"raw"

Redis筆記04 Redis基礎及Key命令

redis基礎 預設有16個資料庫 預設使用第0個 可以使用select進行切換資料庫 127.0.0.1 6379 select 3 切換到第三資料庫 ok127.0.0.1 6379 3 dbsize 檢視資料庫大小 integer 0 清空當前資料庫flushdb清空全部資料庫flushall...

05 Redis的記憶體物件及內部編碼 List

列表 list 用來儲存多個有序的元素 乙個列表可以儲存2 32 1個元素。redis中的列表支援兩端插入和彈出,並可以獲得指定位置 或範圍 的元素,可以充當陣列 佇列 棧等。1 內部編碼列表的內部編碼可以是壓縮列表 ziplist 或雙端鍊錶 linkedlist node,list,and it...

Redis記憶體淘汰策略及Key的過期策略

volatile lru 淘汰最近最少使用的 volatile random 隨機淘汰 volatile ttl 淘汰將要到期的 allkeys random 所有key中隨機淘汰 allkeys lru 所有key中淘汰最近最少使用的 預設的淘汰策略 no enviction enviction譯...