Redis是啥?

王振華


想要了解Redis,先從Redis是什麼?為何要用Redis?有哪些特性,以及其集群架構來幾個方面來了解。


Redis 簡介

Redis 是一個開源(BSD 許可)的、內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。

為什麼要用 Redis

在高併發場景下,如果需要經常連接結果變動頻繁的數據庫,會導致數據庫讀取及存取的速度變慢,數據庫壓力極大。
因此我們需要通過緩存來減少數據庫的壓力,使得大量的訪問進來能夠命中緩存,只有少量的需要到數據庫層。由於緩存基於內存,可支持的併發量遠遠大於基於硬盤的數據庫。所以對於高併發設計,緩存的設計是必不可少的一環。
而 Redis 作為比較熱門的內存存儲系統之一,由於其對數據持久化的支持,種類豐富的數據結構,使其定位更傾向於內存數據庫,適用於對讀寫效率要求都很高、數據處理業務複雜和對安全性要求較高的系統。

Redis 特徵

  1. 單線程,利用 redis 隊列技術將訪問變為串行訪問,消除了傳統數據庫串行控制的開銷。
Redis 的線程模型:
  1. Redis 支持數據的持久化,包括 RDB 的全量持久化,或者 AOF 的增量持久化,從而使得
Redis 掛了,數據是有機會恢復的。也可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用。
  1. 分佈式架構,讀寫分離。
  2. 支持的數據結構豐富。Redis 不僅僅支持簡單的 key-value 類型的數據,同時還提供 list、
set、zset、hash 等數據結構的存儲。
  1. Redis 支持數據的備份,提供成熟的主備同步,故障切換的功能,從而保證了高可用。

Redis Cluster 架構

Redis 搭建方式有很多種,本章主要介紹 Redis Cluster 集群構建方式:
Redis 3.0 之後版本支持 Redis Cluster 集群,Redis Cluster 採用無中心結構,每個節點保存數據和整個集群狀態,每個節點都和其他所有節點連接。
Redis Cluster 為了保證數據的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供數據存取,從節點則是從主節點拉取數據備份,當這個主節點掛掉後,就會有這個從節點選取一個來充當主節點,從而保證集群不會掛掉。主從結構,一是為了純粹的冗餘備份,二是為了提升讀性能,比如很消耗性能的 SORT 就可以由從服務器來承擔。
Redis 的主從同步是異步進行的,這意味著主從同步不會影響主邏輯,也不會降低 redis 的處理性能。
主從架構中,可以考慮關閉主服務器的數據持久化功能,只讓從服務器進行持久化,這樣可以提高主服務器的處理性能。在主從架構中,從服務器通常被設置為只讀模式,這樣可以避免從服務器的數據被誤修改。

雲計算那些事兒


持久化Redis是典型的key-value型數據庫,我們通常把服務器的非空數據庫及鍵值對統稱為數據庫狀態。因為Redis是內存數據庫,它把自己的數據庫狀態存儲在內存中,所以一旦發生停電或者其他因素使主機宕機,那麼數據將會丟失,所以Redis引入了持久化操作,它把Redis在內存中的數據庫狀態持久化到硬盤,當服務器重新啟動的時候,去加載硬盤中的持久化文件就可恢復現場狀態.

Redis有兩種持久化方式:RDB持久化和AOF持久化,前者是通過把數據庫狀態的鍵值對保存起來,而AOF則是把命令保存起來,那麼服務器是使用哪種持久化呢?因為AOF文件更新頻率更高,所以優先AOF.接下來將分別介紹兩種持久化方式

RDB持久化

  • 創建RDB文件:

服務器可以通過save和bgsave來實現rdb持久化,前者會阻塞服務器進程,導致在進行save操作期間,服務器無法繼續處理客戶端請求;bgsave則會派生一個子進程,讓子進程去進行持久化操作,而服務器進程繼續響應客戶端.這裡要說明的是bgsave和save這兩個操作無法同時進行,因為會出現競爭條件.

  • 持久化策略

知道如何創建RDB文件後,我們討論何時執行save和bgsave持久化操作?

由於bgsave會創建子進程來進行持久化操作,並不阻礙服務器進程處理其他事,所以我們可以讓服務器每隔一段時間執行一次bgsave,因此可以通過設置保存條件來讓服務器執行bgsave操作.

好,現在我們真正講述Redis是如何檢查保存條件滿足與否!

Redis服務器有個週期性函數serverCron,默認每隔100ms執行一次,Redis就是通過它來檢測保存條件

介紹到這裡,我們我們已經知道RDB持久化操作的時機和方式,接下來一起看看RDB的文件結構.

  • REDIS長度5字節,保存著'R' 'E' 'D' 'I' 'S' 五個字符,可用來判斷文件是否是rdb文件
  • db_version長度為4字節,值為整數型字符串,代表rdb文件的版本號.比如0006
  • databases 數據庫狀態,包含一個或多個數據庫,以及各個數據庫中的鍵值對
  • EOF常量,1字節,標誌著rdb文件的結束
  • check_sum:8字節的校驗和,程序通過對REDIS,db_version,databases,EOF四部分計算得來,服務器載入rdb文件時,會將文件計算得來的校驗和與該值對比,依次來檢測rdb文件正確性.

知道它的結構後,我們具體看看是如何保存的:

  • databases

有幾個非空數據庫則保存幾個,每個非空數據庫又包含SELECTDB db_number key_value_pairs,

SELECTDB常用為1字節,當程序讀到這個值時,知道自己要選擇數據庫,db_number數據庫號,

key_value_pairs為當前數據庫中所有的鍵值對

  • key_value_pairs:
    • Type有以下幾種類型

key總是字符串類型,鍵值對的形式與鍵是否帶過期值有關,詳情參考上圖,接下來一起學習value

  • value的編碼
  • 字符串對象:字符串對象的格式主要分為兩種,一種是原樣,一種是壓縮後的,int型字符串原樣輸出,raw編碼的如果長度大於20byte採取壓縮形式,否則和int型相同.分別如下所示

  • 列表對象

  • 集合對象(同列表)
  • 集合對象:同集合,不過是元素項開頭加了一個score
  • 哈希表對象:依次table_size key1 value1 key2 value2
  • INTSET 整數集合
  • ziplist編碼的列表,哈希表或有序集合

到這裡RDF持久化基本描述完畢(對rdb文件分析感興趣的可以自己看),接下來一起學習AOFAOF持久化

與RDB持久化保存數據庫中的鍵值對來記錄數據庫不同,AOF持久化是通過記錄Redis服務器所執行的寫命令來記錄數據庫狀態的.那麼AOF持久化具體怎麼實現的呢?

AOF持久化的功能實現可描述為命令追加(append),文件寫入,文件同步(sync)三個步驟

  • 命令追加:服務器每執行一次寫命令,就把對應的命令請求協議內容添加到aof_buf緩衝區
  • 文件寫入和文件同步

AOF文件的載入與數據還原

AOF重寫

由於AOF文件更行頻率很高,用戶會有大量的寫命令,如果每次都記錄,則會浪費大量空間,所以Redis實現了AOF重寫功能:首先從數據庫中讀取鍵現在的值,然後用一條命令去記錄鍵值對,代替之前記錄這個鍵值對的多條命令

AOF後臺重寫

由於redis會伴隨大量的寫入操作,如果服務器去執行aof重寫,則可能長時間阻塞,於是服務器使用子進程來進行aof重寫,子進程持有服務器進程的數據副本.然而在子進程每次重寫期間,服務器又會有新的寫請求,那麼如何解決這個數據不一致問題呢?

為了解決這個問題,Redis服務器設置了一個aof重寫緩衝區,在創建了子進程時,開始使用緩衝區,在子進程重寫期間,每當Redis服務器有新的寫操作,都會把命令同時發給aof緩衝區和重寫緩衝區,這樣一來

  • AOF緩衝區的內容會定期被寫人和同步到AOF文件,對現有AOF文件的處理工作如常進行。
  • 從創建子進程開始,服務器執行的所有寫命令都會被記錄到AOF重寫緩衝區裡面.

當子進程完成AOF重寫工作之後,它會向父進程發送一個信號,父進程在接到該信號後:

  1. 將AOF重寫緩衝區中的所有內容寫入到新AOF文件中,這時新AOF文件所保存的數據庫狀態將和服務器當前的數據庫狀態一致。
  2. 對新的AOF文件進行改名,原子地(atomic)覆蓋現有的AOF文件,完成新舊兩個AOF文件的替換。

啟迪雲Tuscloud


Redis是什麼

Redis的全稱是:REmote DIctionary Server(Redis) ,是由Salvatore Sanfilippo大神寫的key-value存儲系統,現在我們廣義上也是一種nosql(非關係型數據庫), 它是一個開源的使用ANSI C語言進行編寫、遵守一項BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。 它通常被稱為是數據結構服務器,因為它的值(value)既可以是字符串(String)類型, 哈希(Map)類型, 列表(list)類型, 集合(sets)類型和有序集合類型(sorted sets)等數據類型。

Redis的基礎類型

  • 字符串(String)
  • 列表(list)
  • 集合(sets)
  • 有序集合(sorted sets)
  • 哈希(map)

Redis常用場景

跟大家介紹和了解了redis的一些基本的概念,可能大家不太熟悉,那麼通過一些常用的場景來跟大家講解下他的具體應用,加深瞭解!

  • 會話緩存 (session cache)

這是最常用的一種場景,用Redis緩存會話比其他存儲(如Memcached)的優勢在於:Redis提供持久化。

  • 隊列

Reids在內存存儲引擎領域的一大優點是提供 列表list 和 集合sets 操作,這使得Redis能作為很好的消息隊列平臺來使用。Redis作為隊列使用的操作,就類似於本地程序語言(如Python)對 list 的 push/pop 操作。

  • 訂閱和發佈
常用的訂閱服務也可以通過他來實現
  • 計數器
簡單的在redis進行操作實現來了解他
  • 排行榜



如果覺得對您有所幫助,請點個贊支持一下或者關注我!謝謝!


程序猿DH


簡單的介紹下,也是一種數據庫,只是與關係型數據庫不同(oracle、mysql等)的是,它是將數據存儲到內存裡面,也就是當服務器或者說項目,宕機了的情況下,會大幾率會丟失數據(不過redis有快照和備份的功能,可以減低風險)。

樓主目前學習到了框架,等到了學習集成不同框架的時候,可以集成redis框架進行數據讀寫來試試看哦。

更詳細的可以看這個博文,描述的很詳細呢(http://www.cnblogs.com/qunshu/p/3196972.html)

——沒事待在家裡不出門的 居家程序員。(我不想脫髮!)


居家程序員


Redis是一種nosql(非關係型數據庫),也是一個key-value存儲系統,它支持豐富的數據類型,如:string、list、set、zset(sorted set)、hash。

Redis以內存作為數據存儲介質,所以讀寫數據的效率極高,遠遠超過數據庫。以設置和獲取一個256字節字符串為例,它的讀取速度可高達110000次/s,寫速度高達81000次/s。


Trazen


數據庫,目前數據庫種類繁多,以oracle,mysql為主的關係型數據庫,以mongodb為主的非關係型數據庫。redis也是一種數據庫。基於key value存儲。可以實現快速查詢的操作


JohnSunQVS


redis就是個緩存數據庫,存儲一些熱點數據,提高訪問速度,提高併發量,也可以做分佈式鎖,分佈式session等,具體參照官網介紹


分享到:


相關文章: