之前介紹了多種資料結構
字串 鍊錶 字典 跳表 壓縮列表 整數集合
接下來 介紹 這些資料結構在 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 是尋找所需內容最後一次出現的位置...