redis讀書筆記(redis資料結構)

2021-10-12 06:45:29 字數 4600 閱讀 2296

1.redis結構與物件

redis的預設字串是sds(****** dynamic string)

物件中分別包含raw編碼和embstr編碼皆為sds字串物件實現。

1.1 redis的資料型別 :

資料庫鍵總是乙個字串物件。

鍵值則是:

①string字串物件

②列表物件 list

③雜湊物件 hash object

④集合物件 set object

⑤有序集合物件 sorted set object

1.2 關於sds

sds除了作為redis的預設字串外還用作於緩衝區(buffer)

1.2.1 sds結構

①free(表示分配空間)

②len

(表示所儲存字串長度)

③buf(位元組陣列,用於儲存字串。永遠保分配額外乙個位元組去用作學習c字串的空字串結尾 \0)

關於雜湊表

2.1redis因為使用c所以是沒有內建這種資料結構的,所以redis構建了自己的字典實現。

2.2 雜湊表結構

dictht-

dictentry *

*table - 雜湊表陣列

long size - 雜湊表大小

long sizemask - 雜湊表大小掩值 用於計算索引值。總是等於size-

1long used - 該雜湊表已有的節點數量

dictentry-

*key -鍵

union v;

dictentry *next - 只想下乙個雜湊表節點,形成鍊錶

dictentry- - 此雜湊陣列標識了乙個大小為4的空雜湊表,沒有包含任何的鍵值對。

2.3 關於字典

dict-

dicttype *type -類特定函式①

void

*privdata -私有資料

dictht ht[2]

-雜湊表

in trehashidx; rehash索引,當rehash不在進行時,值為-

1

type和privdata屬性是針對不同型別的鍵值對,為建立多型字典而設定的;

4.關於鍊錶

listnode- 

listnode *prev -前置節點

listnode *next -後置節點

*value -節點的值

鍊錶節點

list-

listnode *head -表頭節點

listnode *tail -表尾節點

long len -鍊錶鎖包含的節點數量*(

*dup)

(void

*ptr)

-節點值複製函式

(*free)

(void

*ptr)

-節點值釋放函式

int(

*match)

(void

*ptr,

void

,*key)

-節點值對比函式

5.跳躍表 skiplist *如果有序集合包含的元素數量比較多或者包含元素中的成員是字串比較長的時候才會使用跳躍表

skiplist-

zskiplistnode *header -表頭

zskiplistnode *tail -表尾

level -當前表內,層數最大的那個節點的層數(表頭不計)

length -當前跳躍表包含節點的數量(表頭不計)

zskiplistnode-

zskiplistlevel level[

]zskiplistnode *backward -後退指標

score -分值

robj *obj -成員物件

6.關於整數集合 intset *只有乙個集合只包含整數值元素,並且數量不多的時候才會使用

6.1

intset-

uint32_t encoding -編碼

uint32_t length -元素數量

int8_t contents[

]- 儲存元素的陣列(contents的型別取決於encoding)

6.2 特性

有序、無重複,新增新元素的時候,有需要時會更改陣列的型別。並不支援降級

壓縮列表 *列表鍵和雜湊鍵的底層實現之一。只包含少量列表項,比呢且要麼是小整數值或者長度比較短的字串。redis就會拿來做列表建的底層實現。

7.1 順序型資料結構

zlbytes -

4byte 列表占用記憶體位元組數。在對壓縮列表進行記憶體重分配或者計算zlend的位置使用

zltail -

4byte 記錄起始到表尾的位元組數,

zllen -包含節點量(小於uint16——max 65535時準確,大於的時候只能便利)

entryn..-

zlend -特殊值

8 物件

字串物件string,列表物件list,雜湊物件hash,集合物件set,有序集合sort set。

每個物件都由redisobject結構表示

redisobject-

type:

4-型別

encoding:4

-編碼*ptr -只想底層實現資料結構的指標

lru 最後訪問時間

9.1 字串物件

字串物件可以說int、raw或者embstr

當字串值長度大於32 =raw編碼

小與32=emb編碼

9.2 列表物件

ziplist(壓縮列表)或者linkedlist(雙端鍊錶)

9.3 雜湊物件

ziplist(壓縮列表)或者hashtable(雜湊結構)

9.4 集合物件

inset(正數集合)或者hashtable(雜湊)

9.5 有序集合物件

ziplist(壓縮列表) 或者skiplist(跳躍表)

10 記憶體機制

10.1 引用計數**機制。

19.2 redis會共享0到9999的字串物件

資料結構補充

11 hyperloglog *用於做基數統計的演算法

redis hyperloglog 是用來做基數統計的演算法,hyperloglog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定 的、並且是很小的。

12 geo

將使用者給定的地理位置資訊儲存起來, 並對這些資訊進行操作。

13 pub/sub

訊息的「發布」和「訂閱」的基本能力;但是尚未提供關於訊息的持久化等各種企業級的特性。

13.1 乙個redis client發布訊息,其他多個redis client訂閱訊息,發布的訊息「即發即失」,

13.2 redis不會持久儲存發布的訊息;

13.3 訊息訂閱者也將只能得到訂閱之後的訊息,通道中此前的訊息將無從獲得。

chapter 2 資料庫

14 redis伺服器

14.1

redisserver-

redisdb *db -資料庫陣列

int dbnum -資料庫數量 預設為16(配置檔案內可修改redis.conf)

14.2

redisclient-

redisdb *db -當前使用資料庫指標

redisdb-

dict *dict -資料庫鍵空間,資料庫中所有鍵值對

dict *expires -鍵的過期時間,只想都是同乙個鍵物件,所以不會有重複物件。

15 過期刪除策略

15.1 定時刪除。timer在設定過期時候建立,到點執行。

15.2 惰性刪除。在獲取鍵的同事查詢是否過期。

15.3 定期刪除。一定時間內檢查。

redis使用的是定期和惰性刪除兩種策略。

15.4 aof、rdb和複製功能對過期鍵的處理。

15.4.1 rdb

冷備檔案生成時候會掃瞄過期鍵。載入的時候分為主伺服器和伺服器模式。

主伺服器模式會掃瞄過期,伺服器模式的時候不會掃瞄。

15.4.2 aof

熱備的時候不會因為過期鍵產生任何影響。

命令會被追加。

15.4.3 複製功能

主伺服器模式下,會顯式的傳送del命令刪除過期。

伺服器模式下,只能被動接收伺服器的del命令。

15.5 資料庫通知

2.8版本新增功能。可以讓客戶端通過訂閱給定頻道或者模式來或者資料庫中鍵的變化以及命令的執**況。

可以通過伺服器配種中的 notify-keyspace-events

ake傳送所有通知,ak鍵空間通知,ae鍵事件通知,k$只傳送與字串有關的鍵空間通知,el只傳送與列表鍵有關的事件通知。

Redis讀書筆記(二)

1.通用命令 keys pattern 遍歷所有的key,一般不在生產環境中使用 可用scan代替 dbsize 計算key的總數 exists key 檢查key是否存在 存在返回1 不存在返回0 del key 刪除指定的key key可以設定多個 expire key seconds key ...

讀書筆記 《Redis實戰》

常見db對比表,由於未標明各個db的版本,這個 其實並不準確,特別是附加功能欄。名稱型別 資料儲存結構 查詢型別 附加功能 redis 使用記憶體的非關係型資料庫 字串 列表 集合 有序集合 雜湊表 每種資料型別都有專屬指令 批量操作 不完全的事務支援 發布與訂閱 主從複製 持久化 指令碼 memc...

redis 讀書筆記 1

remote dictionary service 套接字socket 對網路中不同主機上的應用程序之間進行雙向通訊的端點的抽象 持久化 1.作用 防止資料丟失 2.機制 rdb儲存 快照 硬碟 全量備份,二進位制序列化形式 fork產生子程序處理快照持久化 共享記憶體中的 段和資料段 子程序不會改...