Redis 物件 字串物件

2021-09-13 12:13:07 字數 2163 閱讀 1859

之前介紹了多種資料結構

字串   鍊錶    字典   跳表    壓縮列表  整數集合

接下來  介紹  這些資料結構在 redis物件中的使用以及變化

redis物件系統 包括: 字串物件  列表物件   雜湊物件   集合物件   有序集合物件

物件使用了至少1種以上的資料結構,並且在條件發生變化時會進行資料結構的改變

其物件實現了基於引用計數法的記憶體**機制!!!!記憶體碎片問題如何解決?

redis中每個物件都由乙個redisobject結構表示:

typedef struct redisobject  robj;
type屬性記錄了物件的型別,該屬性的值為下面中的乙個:

redis_string     字串物件

redis_list 列表物件

redis_hash 雜湊物件

redis_set 集合物件

redis_zset 有序集合物件

對於redis, 鍵總是乙個字串物件,值可以是上述中的一種

使用 鍵值對 時  至少會建立兩個物件   乙個鍵物件   乙個值物件

如:set msg "hello redis"    其中鍵物件:msg   字串物件   值物件:hello redis    字串物件

物件的ptr指標指向物件的底層資料結構。這個資料結構由物件的encoding屬性決定

encoding屬性可以是下面常量中的乙個:

redis_encoding_int         long型別的整數

redis_encoding_embstr embstr編碼的簡單動態字串

redis_encoding_raw 簡單動態字串

redis_encoding_ht 字典

redis_encoding_linkedlist 雙向鍊錶

redis_encoding_ziplist 壓縮列表

redis_encoding_intset 整數集合

redis_encoding_skiplist 跳躍表 和 字典

每種型別的變數至少使用了兩種不同的編碼

1 五種物件的底層編碼:

字串型別物件:redis_encoding_int   redis_encoding_embstr  redis_encoding_raw

列表型別的物件:redis_encoding_ziplist     redis_encoding_linkedlist

雜湊物件:redis_encoding_ziplist    redis_encoding_ht

集合物件:redis_encoding_intset     redis_encoding_ht

有序集合物件:redis_encoding_ziplist       redis_encoding_skiplist

2  編碼轉換條件

a: 儲存的是整數值  並且此整數值可以用64位長整型表示   則將encoding設定為int,並將ptr的型別由void *轉為long

b: 儲存的是乙個字串,並且字串長度大於39位元組   則將encoding設定為raw, 使用 普通  sds儲存此物件

c: 存的是乙個字串,並且字串長度小於等於39位元組   則將encoding設定為embstr, 使用emb  sds儲存此物件

emb一次性建立redisobject以及sdshdr,並且記憶體是連續的

優點:a 記憶體分配次數由兩次縮減到一次

b 釋放記憶體次數由兩次縮減到一次

c 連續的記憶體空間訪問效率更快

當為int且64位可以處理時,使用endcoding為int進行儲存

當變為str且位元組小於等於39位元組時,使用embstr進行儲存

當對embstr進行增長 字串長度大於39位元組時,使用普通  sds儲存此物件。

api:

setget

incrbyfloat

incrby

decrby

strlen

setrange

getrange

3  命令在編碼上的作用原理

根據2進行推測    其中浮點數採用sds進行儲存

Redis 字串物件

字串物件的編碼可以是int raw或者embstr。如果乙個字串物件儲存的是整數值,並且這個整數值可以用long型別來表示,那麼字串物件會將整數值儲存在字串物件結構的ptr屬性裡面 將void 轉換成long 並將字串物件的編碼設定為int。舉個例子,如果我們執行以下 set 命令,那麼伺服器將建立...

字串物件

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

字串物件

常用的定義字串物件的方法是 string int 當同乙個物件需進行多次定義的時候,除了第一次,剩下的可直接定義 例如 int i 1 第二次 i 2 public int indexof 是尋找所需內容第一次出現的位置 public int lastindexof 是尋找所需內容最後一次出現的位置...