先列舉:java
五大類型:String、List、Hash、Set、Sorted Set、redis
其它: pubsub(應該算獨立功能吧?)、HyperLogLog(2.8.9+)、Geo(3.2+)、Stream(redis5+)數據庫
redis中實現了不少自定義數據結構,但redis並無直接使用這些結構來構建k-v系統,而是使用這些結構建立了一個對象系統;這個對象系統包含了上面咱們列舉的字符串對象、列表對象、哈希對象、集合對象等等;服務器
注:本文假定閱讀者對於redis底層數據結構及實現有必定了解數據結構
注:底層數據結構包括: 簡單動態字符串SDS、鏈表linkedlist、跳躍表skiplist、壓縮列表ziplist、整數集合等等函數
使用對象的優勢:性能
redisObject:學習
說明: redis是一個鍵值對系統,它的鍵老是字符串對象,值爲上述類型中聲明的對象類型(新版本有擴充),使用type
命令可查看數據庫鍵的類型,實際就是數據庫鍵對應的值的類型;優化
-------- 快樂的分割線-------下面介紹五大類型 ----------------ui
redisObject的type爲REDIS_STRING,用type命令查詢,顯示string,編碼表示底層數據結構:
注1:embstr是一種專門保存短字符串的優化編碼,與raw同樣使用redisObject+sdshdr結構,區別是,raw調用兩次內存分配函數來分別建立redisObject結構和sdshdr結構,而embstr則調用一次內存分配函數來分配一塊連續的內存空間,該空間依次包含這兩種結構
注2:浮點型數據,在redis也是作爲字符串對象保存的,保存或者計算時會有一個類型轉換的過程
能夠用ziplist
或linkedlist
表示,後來用quicklist
(3.2+)
ziplist
組成的雙端列表,鏈表的每個節點都是一個ziplist,貌似3.2以後,list只用quicklist結構實現list-max-ziplist-size:每一個ziplist(即quicklist的節點)大小,默認-2,此值可正可負,其中正數表示每一個壓縮列表中存放的最大元素個數,若是是負數,表示按字節數來限定元素個數:
編碼爲ziplist
或hashtable
集合對象的編碼能夠是intset
或者hashtable
set-max-intset-entries
)intset
時,使用hashtable
作爲底層實現,使用hashtable
時,只使用鍵,值爲Null,相似於java的HashSet有序集合的編碼能夠是ziplist
或skiplist
ziplist
實現時,每一個有序集合元素使用挨在一塊兒的兩個ziplistNode
表示,第一個表示元素成員member,第二個表示分值score;ziplist
中的集合元素按分值從小到大排列,小的靠近表頭方向,大的靠近表尾方向;知足以下條件時使用:
zset-max-ziplist-entries
)zset-max-ziplist-value
)zset
結構作爲底層實現,每一個zset
同時包含一個字典dict和一個跳躍表skiplist:
注:編碼爲skiplist
時,跳躍表和字典會共享成員及分值,內存中只佔一分,由於不存在內存浪費;
----- 快樂的分割線 -------- 下面其它類型,還沒好好研究完---------
發佈/訂閱彷佛是一項獨立功能,不能算一種數據類型,不過從使用上差很少,估且也算在這兒吧;
redis的發佈/訂閱功能分爲兩類:頻道的發佈/訂閱及模式的發佈/訂閱;redis的服務器在redis內部用redisServer
結構表示,而發佈訂閱的實現,依賴於redisServer
中的兩個屬性:
pubsub_channels
字典,字典的鍵表示被訂閱的頻道,而值是一個鏈表,存儲了全部訂閱該頻道的客戶端;
pubsub_patterns
鏈表,每一個節點都包含一個pubsubPattern
結構,該結構中存儲了訂閱模式的客戶端和訂閱的模式;
pubsubPattern
結構,添加到pubsub_patterns
鏈表尾pubsub_patterns
,找到含要退訂的模式和客戶端的節點,刪除pubsub_patterns
,向模式匹配的客戶發消息注:訂閱將阻塞線程,應該在獨立線程獨立客戶端中使用;
使用type查詢一個HyperLogLog類型的值,是string,彷佛,是基於string結構實現的HyperLogLog功能?待探究
還沒有研究,且目前5.0版本中,做者不建議在生產環境中使用stream,因此學習後再補充
-------- 快樂的分割線------- 知識擴展 ----------------