王振華
想要了解Redis,先從Redis是什麼?為何要用Redis?有哪些特性,以及其集群架構來幾個方面來了解。
Redis 簡介
為什麼要用 Redis
Redis 特徵
- 單線程,利用 redis 隊列技術將訪問變為串行訪問,消除了傳統數據庫串行控制的開銷。
- Redis 支持數據的持久化,包括 RDB 的全量持久化,或者 AOF 的增量持久化,從而使得
- 分佈式架構,讀寫分離。
- 支持的數據結構豐富。Redis 不僅僅支持簡單的 key-value 類型的數據,同時還提供 list、
- Redis 支持數據的備份,提供成熟的主備同步,故障切換的功能,從而保證了高可用。
Redis Cluster 架構
雲計算那些事兒
持久化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重寫工作之後,它會向父進程發送一個信號,父進程在接到該信號後:
- 將AOF重寫緩衝區中的所有內容寫入到新AOF文件中,這時新AOF文件所保存的數據庫狀態將和服務器當前的數據庫狀態一致。
- 對新的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 操作。
- 訂閱和發佈
- 計數器
- 排行榜
如果覺得對您有所幫助,請點個贊支持一下或者關注我!謝謝!
程序猿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等,具體參照官網介紹