redis 是速度非常快的非關係型(nosql)記憶體鍵值資料庫,可以儲存鍵和五種不同型別的值之間的對映。
在關係型資料庫如mysql中,表的結構比較複雜會包含很多個字段。可以使用查詢語句實現非常複雜的查詢需求,而redis中只能包含鍵和值兩部分,只能通過鍵來查詢或新增值。redis 鍵的型別只能為字串,值支援五種資料型別:字串、列表、集合、雜湊表、有序集合。並且redis的資料是儲存在記憶體中的,所以它的速度非常快。
列表支援儲存一組資料,有兩種實現方法:
壓縮列表
壓縮列表是redis設計的一種資料儲存結構,類似陣列。通過一篇連續的記憶體空間來儲存資料,並且允許儲存的資料大小不同。但要求列表中資料個數不超過512個並且每個資料小於64位元組。
具體的結構也很簡單:陣列由連續的單元組成,其中每個單元第乙個位元組記錄該單元資料位的長度,從第二個位元組開始儲存實際的資料。此外陣列頭部還有乙個位元組記錄陣列元素的個數。
採用壓縮列表的優點是:
但是值得注意的是,壓縮列表並不能像常規的列表一樣支援隨機訪問,redis在讀取資料時,一般是按照鍵獲取整個列表的資料。
雙向迴圈鍊錶
當列表中的資料量比較大的時候,redis中的列表就需要使用雙向迴圈鍊錶來實現。這裡的雙向迴圈鍊錶與常規的有點區別,它額外定義了乙個list結構體用於組織鍊錶的首、尾指標、長度等資訊。
字典型別用來儲存一組資料對,即每個資料對都包含鍵和值兩部分。同樣的,字典型別也有兩種實現方式:
壓縮列表
這裡壓縮列表的限制條件還是一樣的,只能儲存比較小的資料量。具體的資料結構組織方式與列表類似,不同點就是單元中的資料由一部分變成了鍵和值兩部分。
雜湊表
redis使用murmurhash2作為雜湊函式,優點就是執行速度快、隨機性好。使用鍊錶法解決雜湊衝突,並且redis還支援動態擴容和縮容。
集合用於儲存一組不重複的資料,集合型別也有兩種實現方式:有序陣列和雜湊表。
當要儲存的資料都是整數且資料個數不超過512個時redis就會採用有序陣列的方式實現集合。不滿足這兩個條件時,採用雜湊表來實現集合。
有序集合與集合的不同之處在於,每個資料都會附帶乙個分數,通過分數的大小再借助跳表實現快速的按照分數大小、區間獲取資料。同樣的,有序集合還有另外的實現方式:壓縮列表。
資料持久化有兩種實現方式:
第一種,清除原有的資料結構,只儲存資料。還原時在重新將資料組織成原來的資料結構;
第二種,保留原來的資料結構格式,將資料按照原有格式儲存。
redis採用的是第一種的實現方式,這種方式還原的時候會比較耗費時間並且在恢復雜湊表時,還需要重新計算雜湊值。
實際操作中redis資料持久化有兩種操作方式:
rdb持久化
將某個時間點的所有資料都存放到硬碟上 , 這樣可以將快照複製到其它伺服器從而建立具有相同資料的伺服器副本。
aof持久化
Redis 基礎常識原理介紹
redis 基礎常識原理介紹 磁碟 定址 ms 頻寬 g m 記憶體 定址 ns 頻寬 很大 秒 毫秒 微妙 納秒 磁碟比內存在定址上慢了10w倍 i o buffer 磁碟與磁軌 扇區 一扇區 512byte 讀取資料造成索引成本變大 作業系統 無論怎麼讀,都是從系統讀取4k資料 預設 資料庫 資...
Redis原理介紹
redis是乙個基於key value的快取記憶體系統,類似於memcached,但是支援更複雜的資料結構list set sortedset,並且有持久化的功能。由於近期工作很多地方都用到了它,所以花了不少時間來閱讀文章 編碼實驗,了解一下 redis 都能做些什麼,能有什麼樣的效能表現。首先遇到...
redis原理總結
redis單點吞吐量 單點tps達到8萬 秒,qps達到10萬 秒。redis的5中儲存型別 string list set map hash stored set redis的string型別 能表達3中型別 字串 整數和浮點數。根據場景相互間自動轉型,並且根據需要選取底層的承載方式 value內...