鍵值數據庫是一類輕量級結合內存處理為主的NoSQL數據庫。
為什么說他是輕量級???
1.他的存儲數據結構特別簡單,數據庫系統本身的規模也比較小
2.以內存為主的運行處理,目的是為了更快的實現對大數據的處理
鍵值存儲實現:
鍵值數據庫的設計原則是以提高數據處理速度為第一目標
一、鍵值數據庫實現的基本原理
鍵值數據庫數據結構最早借鑒了一維數組的設計方法;鍵值數據庫設計時放寬了對下標和值的限制,所以key具有唯一地址的作用,也用來存在唯一內容,對value值存儲內容不限制,可以存儲字符串、數字、視頻、圖片、音頻等,但是key--value必須成對出現。
且鍵下的內容必須具有唯一性,目的是為建立索引及數據查找提供方便,但任然起着唯一地址的作用。
只有數據存儲結構和數據,數據得不到永久保存不能稱為真正的數據庫。於是通過各種鍵值數據庫系統的各種存儲策略,以一定時間周期把數據復制到本地硬盤、閃存盤,鍵值數據庫就初步成型了。但是在大數據環境下單機的內存要受容量限制,那么引入分布式處理方式便成為鍵值數據庫的必然選擇也是其基本特征之一。
二、鍵值數據庫存儲的基本要素
key(鍵):
起唯一索引值的作用,確保一致鍵值結構李數據記錄的唯一性,同時也起信息記錄的作用,可以采用復雜的自定義結構,只要保持唯一即可
注意:
鍵不是越長越好(不要超過1024字節),鍵的內用越多,內存開銷越大,從而降低查詢效率,而且在大數據環境下,給數據查找這類計算帶來更大的運行負擔
鍵的內容太短也不好,可讀性不高
在同一類數據集合中,鍵的命名規范最好統一
value(值):
值是對應鍵相關的數據,通過鍵來獲取,可以存放任何類型的數據,鍵值數據庫的值由二進制大對象(BLOB)進行存儲,這意味着任何類型的數據都可以保存,無需預先定義數據類型,在關系型數據庫中是強制要求預先定義存儲數據類型的
注意:
不同的鍵值數據庫對值會有不同的約束,特別是在值存儲的大小上,不同數據庫,甚至不同數據庫里的不同數據集對象的約束是不一樣的。例如redis中一個string的值,最大可以存儲字節數為512M
鍵值對(key-value pair):
鍵和值的組合就構成了鍵值對,他們之間的關系是一對一
命名空間(namespace):
命名空間是由鍵值所構成的集合,通常是一類鍵值對數據構成一個集合。
在鍵值對的基礎上增加命名空間,是為了在內存中訪問該數據集時,該數據集具有唯一的名稱,類似傳統關系型數據庫對應的表
PS:
可以把namespace看做是一個最小的鍵值數據庫,當然鍵值數據庫更多指的是多namespace。部分鍵值數據庫也稱之為桶,即鍵值數據庫和桶是一個意思
三、基本數據操作方式
NoSQL的鍵值數據庫有了存儲結構和數據,就需要考慮對數據的讀寫刪除的操作要求了,由於NoSQL數據庫沒有SQL概念,他們對數據操作的實現是通過PUT、GET、delete實現的
put命令:
用於寫或者更新鍵值存儲里指定地址的值,當指定地址有值時,更新值,沒有值時,新增一個值
get命令:
用於讀取鍵值存儲里指定地址的值,如果沒有值,返回一條錯誤提示信息
delete命令:
用於刪除鍵值存儲指定地址的鍵和值,如果鍵值存儲里沒有該鍵,就返回一條錯誤提示信息
鍵值存儲的特點
優點
簡單:
數據存儲結構只有鍵和值,並成對出現,值理論上可以存儲任意數據,並支持大數據存儲,凡是具有類似關系的數據應用,可以考慮鍵值數據庫,如熱門網頁排行
快速:
以內存為主的設計思路使鍵值數據庫擁有了快速處理數據的優勢
高效計算:
數據結構簡單化,而且數據集之間關系的簡單化(沒有傳統數據庫中多表關聯關系),基於內存的數據集計算,為大量用戶訪問情況下,提供高速計算並響應的應用提供了技術支持
分布式處理:
分布式處理能力使鍵值數據庫具備了處理大數據的能力
缺點
對值進行多值查找功能很弱
鍵值數據庫在設計之初就以鍵為主要對象進行各種數據操作,包括查找功能,對值直接進行操作的功能很弱
缺少約束,意味着更容易出錯
鍵值數據庫不用強制命令預先定義鍵和值所存儲的數據類型,那么在具體業務使用過程中,原則上值里什么數據都可以存放,甚至放錯了都不會報錯。這在某些應用場景上很致命,例如商品價格,需要程序猿對業務代碼進行編程約束,避免潛在問題,由於沒有值的類型定義,當有多名程序猿編程的情況下,需要更加重視設計文檔的建立,否則可能A把價格當做整型數據,B把價格看做字符串,C把價格看做浮點數,容易引起代碼編寫混亂,也給后續的軟件系統的代碼維護代碼了麻煩
不容易建立復雜關系
鍵值數據庫的數據集,不能像傳統關系型數據庫那樣建立復雜的橫向關系,鍵值數據庫局限於兩個數據集之間的有限計算,例如redis數據庫里做交、並、補集運算