NoSQL:鍵值資料庫
鍵值資料庫(key-value store)是一張簡單的雜湊表(hash table),主要用在所有資料庫訪問均通過主鍵(primary key)來操作的情況下。
應用程式可以提供鍵和值,並將這一鍵值對持久化。假如鍵已存在,就用新值覆蓋當前值,否則就新建一條資料。
下表是關係型資料庫Oracle和鍵值資料庫Riak的術語對比:
Oracle | Riak |
---|---|
資料庫例項(database instance) | Riak叢集(Riak cluster) |
表(table) | 儲存區(bucket) |
行(row) | 鍵值對(key-value) |
偽列(rowid) | 鍵(key) |
什麼是鍵值資料庫
從API的角度來看,簡直資料庫是最簡單的NoSQL資料庫。客戶端可以根據鍵查詢值,設定鍵所對應的值,或從資料庫中刪除鍵。“值”只是資料庫儲存的一塊資料而已,它並不關心也無需知道其中的內容;應用程式負責理解所存資料的含義。由於鍵值資料庫總是通過主鍵訪問,所以它們一般效能較高,且易於擴充套件。
在Redis等鍵值資料庫中,所儲存的聚合不一定非要是領域物件(domain object),任何資料結構都可以。Redis能夠儲存list、set、hash等資料結構,而且支援“獲取某個範圍內的數值(range)”、“求差集(diff)”、“求並集(union)”、“求交集(intersection)”等操作。
鍵值資料庫特性
-
一致性:只有針對單個鍵的操作才具備“一致性”。對於Riak這種分散式鍵值資料庫,用“最終一致性模型”實現“一致性”。(參考:NosQL分散式模型:放寬一致性約束)
-
事務:Riak採用“仲裁”這一概念來實現事務功能。(參考:NosQL分散式模型:仲裁)
-
查詢:由於需要根據鍵值查詢,所以可以根據時間戳等資料庫之外的值來生成鍵名,所以鍵值資料庫非常適合儲存會話(會話ID為主鍵)、購物車資料、使用者配置等資訊。還可以使用expiry_secs屬性指定關鍵字的過期時間,這對會話或購物車物件特別有用。
-
資料結構:鍵值資料庫並不關心鍵值對裡的值,可以是二進位制塊、文字、JSON、XML等。
-
可擴充套件性:很多鍵值資料庫都可用“分片”技術。(參考:NosQL分散式模型:分片)
適用案例
- 存放會話資料
- 使用者配置資訊
- 購物車資料
不適用案例
- 需要在不同資料集之間建立關係,或是將不同的關鍵字集合聯絡起來。
- 需要執行含有多項操作的事務,而又需要復原或回滾。
- 需要根據鍵值對的某部分來查詢關鍵字。
- 需要同時操作多個關鍵字。