1. 程式人生 > 實用技巧 >【Redis】01 NoSQL概述 & Redis

【Redis】01 NoSQL概述 & Redis

NoSQL概述:

1、什麼是NoSQL

NoSQL是Not Only SQL的縮寫,意即"不僅僅是SQL"的意思,泛指非關係型的資料庫。強調Key-Value Stores和文件資料庫的優點。

NoSQL產品是傳統關係型資料庫的功能閹割版本,通過減少用不到或很少用的功能,來大幅度提高產品效能

2、NoSQL起源

過去,關係型資料庫(SQL Server、Oracle、MySQL)是資料持久化的唯一選擇,但隨著發展,關係型資料庫存在以下問題。

問題1:不能滿足高效能查詢需求
  我們使用:Java、.Net等語言編寫程式,是面向物件的。
 但用資料庫都是關係型資料庫。儲存結構是面向物件的,
 但是資料庫卻是關係的,所以在每次儲存或者查詢資料時,我們都需要做轉換。
類似Hibernate、Mybatis這樣的ORM框架確實可以簡化這個過程,但是在對高效能查詢需求時,這些ORM框架就捉襟見肘了。 問題2:應用程式規模的變大 網路應用程式的規模變大,需要儲存更多的資料、服務更多的使用者以及需求更多的計算能力。
 為了應對這種情形,我們需要不停的擴充套件。 擴充套件分為兩類: 一種是縱向擴充套件,即購買更好的機器,更多的磁碟、更多的記憶體等等。 另一種是橫向擴充套件,即購買更多的機器組成叢集。
在巨大的規模下,縱向擴充套件發揮的作用並不是很大。 首先單機器效能提升需要鉅額的開銷並且有著效能的上限,在Google和Facebook這種規模下,永遠不可能使用一臺機器支撐所有的負載。
鑑於這種情況,我們需要新的資料庫,因為關係資料庫並不能很好的執行在叢集上

3、NoSQL資料庫型別

①鍵值(Key-Value)資料庫[Redis/Memcached]
適用場景:

儲存使用者資訊,比如會話、配置檔案、引數、購物車等等。這些資訊一般都和ID(鍵)掛鉤,這種情景下鍵值資料庫是個很好的選擇。

不適用場景:

1.取代通過鍵查詢,而是通過值來查詢。Key-Value資料庫中根本沒有通過值查詢的途徑

2.需要儲存資料之間的關係。在Key-Value資料庫中不能通過兩個或以上的鍵來關聯資料。

3.事務的支援。在Key-Value資料庫中故障產生時不可以進行回滾。
②面向文件(Document
-Oriented)資料庫[MongoDB] 資料可以使用XML、JSON或者JSONB等多種形式儲存。 適用場景:1.日誌 2.分析 不適用場景:不支援事務 ③列儲存(Wide Column Store/Column-Family)資料庫[HBASE] 列儲存資料庫將資料儲存在列族(column family)中,一個列族儲存經常被一起查詢的相關資料。舉個例子,如果我們有一個Person類,我們通常會一起查詢他們的姓名和年齡而不是薪資。這種情況下,姓名和年齡就會被放入一個列族中,而薪資則在另一個列族中。 適用場景:1.日誌 2.部落格平臺,我們儲存每個資訊到不同的列族中。舉個例子,標籤可以儲存在一個,類別可以在一個,而文章則在另一個。 不適用場景:1.ACID事務 2.原型設計。在模型設計之初,我們根本不可能去預測它的查詢方式,而一旦查詢方式改變,我們就必須重新設計列族。 ④圖(Graph-Oriented)資料庫[Neo4J] 適用範圍很小,主要用用網路拓撲分析 如脈脈的人員關係圖等

4、傳統RDBMS VS NOSQL

RDBMS

- 高度組織化結構化資料

- 結構化查詢語言(SQL)

- 資料和關係都儲存在單獨的表中。

- 資料操縱語言,資料定義語言

- 嚴格的一致性

- 基礎事務

NoSQL

- 代表著不僅僅是SQL

- 沒有宣告性查詢語言

- 沒有預定義的模式

- 鍵 - 值對儲存,列儲存,文件儲存,圖形資料庫

- 最終一致性,而非ACID【原子,一致,隔離,持久】屬性

- 非結構化和不可預知的資料

- CAP定理【一致性,可用性,容錯性】

- 高效能,高可用性和可伸縮性

5、常見的NoSQL

1、Memcached

揮發性(臨時性)的鍵值儲存

一般作為關係型資料庫的快取來使用

具有非常快的處理速度

由於存在資料丟失的可能,所以一般用來處理不需要持久儲存的資料

用於需要使用expires時(需要定期清除資料)

使用一致性雜湊(Consistent Hashing)演算法來分散資料

2、Tokyo Tyrant

永續性的鍵值儲存

用來處理需要持久儲存,高速處理的資料

具有非常快的處理速度

用於不需要定期清除的資料

使用一致性雜湊(Consistent Hashing)演算法來分散資料

3、Redis

兼具Memcached和Tokyo Tyrant優勢的鍵值儲存

擅長處理陣列型別的資料

具有非常快的處理速度

可以高速處理時間序列的資料,易於處理集合運算

擁有很多可以進行原子操作的方法

使用一致性雜湊(Consistent Hashing)演算法來分散資料

4、MongoDB

面向無需定義表結構的文件資料

具有非常快的處理速度

通過BSON的形式可以儲存和查詢任何型別的資料

無法進行JOIN處理,但是可以通過嵌入(embed)來實現同樣的功能

使用sharding(範圍分割)演算法來分散資料

Redis簡介

1、Redis簡介

Redis:Remote Dictionary Server(遠端字典伺服器)

Redis是當前比較熱門的NOSQL系統之一,它是一個開源的使用ANSI c語言編寫的key-value儲存系統(區別於MySQL的二維表格的形式儲存。)。

和Memcache類似,但很大程度補償了Memcache的不足。

和Memcache一樣,Redis資料都是快取在計算機記憶體中,不同的是,Memcache只能將資料快取到記憶體中,無法自動定期寫入硬碟,

這就表示,一斷電或重啟,記憶體清空,資料丟失。

所以Memcache的應用場景適用於快取無需持久化的資料。

而Redis不同的是它會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,實現資料的持久化

2、Redis的特點

Redis讀取的速度是110000次/s,寫的速度是81000次/s

原子 。Redis的所有操作都是原子性的,同時Redis還支援對幾個操作全並後的原子性執行。

支援多種資料結構:
string(字串);list(列表);hash(雜湊),set(集合);zset(有序集合)

持久化,主從複製(叢集)

支援過期時間,支援事務,訊息訂閱。

官方不支援window,但是又第三方版本。

3、Redis的應用場景

1、資料快取(提高訪問效能) 
將一些資料在短時間之內不會發生變化,而且它們還要被頻繁訪問,為了提高使用者的請求速度和降低網站的負載,降低資料庫的讀寫次數,就把這些資料放到快取中。

2、會話快取
(session cache,儲存web會話資訊)
3、排行榜/計數器 (NGINX+lua+redis計數器進行IP自動封禁) 4、訊息佇列 (構建實時訊息系統,聊天,群聊)