1. 程式人生 > 其它 >第一章 Redis基本原理

第一章 Redis基本原理

一.快取資料庫的概念

	傳統的資料庫管理系統把所有資料都放在磁碟上進行管理,所以稱做磁碟資料庫(DRDB:Disk-Resident Database)。磁碟資料庫需要頻繁地訪問磁碟來進行資料的操作,由於對磁碟讀寫資料的操作一方面要進行磁頭的機械移動,另一方面受到系統呼叫(通常通過CPU中斷完成,受到CPU時鐘週期的制約)時間的影響,當資料量很大,操作頻繁且複雜時,就會暴露出很多問題。

	近年來,記憶體容量不斷提高,價格不斷下跌,作業系統已經可以支援更大的地址空間(計算機進入了64位時代),同時對資料庫系統實時響應能力要求日益提高,充分利用記憶體技術提升資料庫效能成為一個熱點。

	在資料庫技術中,目前主要有兩種方法來使用大量的記憶體。一種是在傳統的資料庫中,增大緩衝池,將一個事務所涉及的資料都放在緩衝池中,組織成相應的資料結構來進行查詢和更新處理,也就是常說的共享記憶體技術,這種方法優化的主要目標是最小化磁碟訪問。另一種就是記憶體資料庫(MMDB:Main Memory Database,也叫主存資料庫)技術,就是乾脆重新設計一種資料庫管理系統,對查詢處理、併發控制與恢復的演算法和資料結構進行重新設計,以更有效地使用CPU週期和記憶體,這種技術近乎把整個資料庫放進記憶體中,因而會產生一些根本性的變化。

	記憶體資料庫系統帶來的優越效能不僅僅在於對記憶體讀寫比對磁碟讀寫快上,更重要的是,從根本上拋棄了磁碟資料管理的許多傳統方式,基於全部資料都在記憶體中管理進行了新的體系結構的設計,並且在資料快取、快速演算法、並行操作方面也進行了相應的改進,從而使資料處理速度一般比傳統資料庫的資料處理速度快很多,一般都在10倍以上,理想情況甚至可以達到1000倍。

	而使用共享記憶體技術的實時系統和使用記憶體資料庫相比有很多不足,由於優化的目標仍然集中在最小化磁碟訪問上,很難滿足完整的資料庫管理的要求,設計的非標準化和軟體的專用性造成可伸縮性、可用性和系統的效率都非常低,對於快速部署和簡化維護都是不利的。

二.記憶體資料庫歷史和發展

1.雛形期

從上個世紀60年代末到80年代初。在這個時期中,出現了主存資料庫的雛形。1969年IBM公司研製了世界上最早的資料庫管理系統——基於層次模型的資料庫管理系統IMS,並作為商品化軟體投入市場。在設計IMS時,IBM考慮到基於記憶體的資料管理方法,相應推出了IMS/VS Fast Path。Fast Path是一個支援記憶體駐留資料的商業化資料庫,但它同時也可以很好地支援磁碟駐留資料。在這個產品中體現了主存資料庫的主要設計思想,也就是將需要頻繁訪問,要求高響應速度的資料直接存放在實體記憶體中訪問和管理。在這個階段中,包括網狀資料庫、關係資料庫等其他各種資料庫技術也都逐漸成型。

2. 技術理論成熟期

1984 年,D J DeWitt 等人發表了《主存資料庫系統的實現技術》一文。第一次提出了 Main Memory Database(主存資料庫)的概念。預言當時異常昂貴的計算機主存價格一定會下降,使用者有可能將大容量的資料庫全部儲存在主存中,提出了 AVL 樹、雜湊演算法、主存資料庫恢復機制等主存資料庫技術的關鍵理論,為主存資料庫發展指出了明確的方向 。

1984 年,D J DeWitt 等人提出使用非易逝記憶體或預提交和成組提交技術作為主存資料庫的提交處理方案,使用指標實現主存資料庫的存取訪問。

1985 年,IBM 推出了 IBM 370 上執行的 OBE 主存資料庫。

1986 年,RB Hagman 提出了使用檢查點技術實現主存資料庫的恢復機制。威斯康星大學提出了按區雙向鎖定模式解決主存資料庫中的併發控制問題。並設計出 MM-DBMS 主存資料庫。貝爾實驗室推出了 DALI 主存資料庫模型。

1987 年,ACM SIGMOD 會議中提出了以堆檔案(HEAP FILE)作為主存資料庫的資料儲存結構。SouthernMethodist 大學設計出 MARS 主存資料庫模型。

1988 年普林斯頓大學設計出 TPK 主存資料庫。

1990 年普林斯頓大學又設計出 System M 主存資料庫。

3.產品發展期和市場成長期

隨著網際網路的發展,越來越多的網路應用系統需要能夠支援大使用者量併發訪問、高響應速度的的資料庫系統,主存資料庫市場成熟半導體技術快速發展,半導體記憶體大規模生產,動態隨機存取儲存器(DRAM)的容量越來越大,而價格越來越低,這無疑為計算機記憶體的不斷擴大提供了硬體基礎,使得主存資料庫的技術可行性逐步成熟

1994年美國OSE公司推出了第一個商業化的,開始實際應用的主存資料庫產品Polyhedra

1998年德國SoftwareAG推出了Tamino Database。

1999年日本UBIT會社開發出XDB主存資料庫產品。韓國Altibase推出Altibase。

2000年奧地利的QuiLogic公司推出了SQL-IMDB。

2001年美國McObject推出eXtremeDB。加拿大Empress公司推出EmpressDB。

4.幾種主存技術應用的比較

第一代:使用者定製的主存資料庫。通過應用程式來管理記憶體和資料;不支援SQL語句, 不提供本地儲存, 沒有資料庫恢復技術;效能好但很難維護和在別的應用中不能使用;應用在實時領域比如工廠自動化生產。

第二代:簡單功能的記憶體資料庫。能夠快速處理簡單的查詢;支援部分的 SQL語句和簡單的恢復技術;主要目的是能夠快速處理大量事務;針對簡單事務處理領域,尤其是交換機, 行動通訊等。

第三代:通用的主存資料庫。針對傳統的商業關係型資料庫領域,能夠提供更高的效能、通用性以及穩定性;提供不同的介面來處理複雜的SQL語句和滿足不同的應用領域;可以應用在計費、電子商務、線上安全領域,幾乎包括磁碟資料庫的所有應用領域。

5.幾種企業中常用的快取資料庫比較

1)Memcached

#1. Memcached簡介
Memcached是一個自由開源的,高效能,分散式記憶體物件快取系統。

Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric為首開發的一款軟體。現在已成為mixi、hatena、Facebook、Vox、LiveJournal等眾多服務中提高Web應用擴充套件性的重要因素。

Memcached是一種基於記憶體的key-value儲存,用來儲存小塊的任意資料(字串、物件)。這些資料可以是資料庫呼叫、API呼叫或者是頁面渲染的結果。

Memcached簡潔而強大。它的簡潔設計便於快速開發,減輕開發難度,解決了大資料量快取的很多問題。它的API相容大部分流行的開發語言。

本質上,它是一個簡潔的key-value儲存系統
一般的使用目的是,通過快取資料庫查詢結果,減少資料庫訪問次數,以提高動態Web應用的速度、提高可擴充套件性。

#2. Memcached優缺點
優點:高效能讀寫、單一資料型別、支援客戶端式分散式叢集、一致性hash多核結構、多執行緒讀寫效能高。

缺點:無持久化、節點故障可能出現快取穿透、分散式需要客戶端實現、跨機房資料同步困難、架構擴容複雜度高。

2) Redis

#.1 Redis簡介
Redis是一款開源的,ANSI C語言編寫的,高階鍵值(key-value)快取和支援永久儲存NoSQL資料庫產品。
Redis採用記憶體(In-Memory)資料集(DataSet) 。
支援多種資料型別。
運行於大多數POSIX系統,如Linux、*BSD、OS X等。

redis就是非關係型資料庫的一種,儲存方式是:key:value

#2.Redis優缺點
優點:高效能讀寫、多資料型別支援、資料持久化、高可用架構、支援自定義虛擬記憶體、支援分散式分片叢集、單執行緒讀寫效能極高。

缺點:不支援多執行緒讀寫,相比Memcached會慢。

3)Tair

#.1 Tair 簡介
Tair是由淘寶網自主開發的Key/Value結構資料儲存系統,在淘寶網有著大規模的應用。您在登入淘寶、檢視商品詳情頁面或者在淘江湖和好友“搗漿糊”的時候,都在直接或間接地和Tair互動。

Tair是一個Key/Value結構資料的解決方案,它預設支援基於記憶體和檔案的兩種儲存方式,分別和我們通常所說的快取和持久化儲存對應。

Tair除了普通Key/Value系統提供的功能,比如get、put、delete以及批量介面外,還有一些附加的實用功能,使得其有更廣的適用場景。

#.2 Tair 優缺點
優點:高效能讀寫、支援三種儲存引擎(ddb、rdb、ldb)、支援高可用、支援分散式分片叢集、支撐了幾乎所有淘寶業務的快取。

缺點:單機情況下,讀寫效能較其他兩種產品較慢。

4)測試

5)測試結果

Memcached:多核的快取服務,更加適合於多使用者併發訪問次數(訪問次數較少的應用場景)。
Redis:單核快取服務,在單節點情況下,更加適合少量使用者,多次訪問的應用場景。

三、企業級快取中介軟體Redis

1.redis簡介

Redis是一款開源的,ANSI C語言編寫的,高階鍵值(key-value)快取和支援永久儲存NoSQL資料庫產品。
Redis採用記憶體(In-Memory)資料集(DataSet) 。
支援多種資料型別。
運行於大多數POSIX系統,如Linux、*BSD、OS X等。

redis就是非關係型資料庫的一種,儲存方式是:key:value

2.redis的作用

1.會話保持(鍵過期)
2.快取(放在資料庫前面,memcache,mongodb)
3.訊息佇列(kafka)

3.為什麼要用Redis

1.redis功能全面
2.redis企業使用率高

4.redis優點

1.高速讀寫
	將所有資料儲存在記憶體,單執行緒服務,使用C語言
2.部署簡單,使用穩定
3.資料型別豐富
    String: 字串型別
    Hash: 雜湊型別
    List: 列表型別
    Set: 集合型別
    Sorted set: 順序集合型別
4.支援持久化
	將記憶體的資料寫入磁碟
5.多種記憶體分配及回收策略
6.支援事物、鎖
7.訊息佇列、訊息訂閱
8.支援高可用
	哨兵模式
9.支援分散式分片叢集
10.支援的客戶端語言很多
	java,php,python,nodejs,C語言

5.redis幫助

官方網站:https://redis.io/
下載網站:http://download.redis.io/releases/
幫助網站:http://redisdoc.com/

6.軟體特性

1.透明性
	分散式系統對使用者來說是透明的,一個分散式系統在使用者面前的表現就像一個傳統的單處理機分時系統,可讓使用者不必瞭解內部結構就可以使用。

2.擴充套件性
	分散式系統的最大特點就是可擴充套件性,他可以根據需求的增加而擴充套件,可以通過橫向擴充套件使叢集的整體效能得到線性提升,也可以通過縱向擴充套件單臺伺服器的效能使伺服器叢集的效能得到提升。

3.可靠性
	分散式系統不允許單點失效的問題存在,它的基本思想是:如果一臺伺服器壞了,其他伺服器接替它的工作,具有持續服務的特性。

4.高效能
	高效能是人們設計分散式系統的一個初衷,如果建立了一個透明,靈活,可靠的分散式系統,但他執行起來像蝸牛一樣慢,那這個系統就是失敗的。

7.Redis的常用功能

1.高速讀寫:Redis在執行時,將資料放在記憶體當中,利用記憶體的高效能的特性提高自己的服務效能。

2.資料型別豐富:Redis具有豐富的資料型別,可以適用於各種場景。

3.支援持久化:因為Redis的資料是放在記憶體當中的,當Redis關機或者記憶體失效時,資料隨即丟失,不可找回,為了避免Redis重啟時發生類似於雪崩事件,所以Redis官方增加了一個數據持久化的功能。

4.多種記憶體分配及回收策略:Redis可以通過 maxmemory 引數來限制最大可用記憶體,主要為了避免Redis記憶體超過作業系統記憶體,從而導致伺服器響應變慢甚至宕機的情況。而回收策略主要是刪除過期的key以及記憶體達到 maxmemory 後的淘汰機制。

5.支援事物:Redis也支援類似於MySQL資料庫那樣的事務。

6.訊息佇列、訊息訂閱: Redis的列表型別鍵可以用來實現佇列,並且支援阻塞式讀取,可以很容易的實現一個高效能的優先佇列。同時在更高層面上,Redis還支援"釋出/訂閱"的訊息模式,可以基於此構建一個聊天系統。

7.支援高可用:Redis支援兩種高可用叢集方式。

四、Redis使用場景

1.快取
	放在資料庫前面
2.會話保持
	登入cookie、session
	折扣券,代金券
3.排行榜
4.計數器
	論壇帖子點贊點踩
5.社交軟體
	QQ共同好友,微博共同愛好
6.訊息佇列
	結合ELK做日誌收集