版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
課程主講人:任務(wù)3.1掌握鍵值數(shù)據(jù)庫(kù)基礎(chǔ)大存儲(chǔ)與管理數(shù)周蘇教授據(jù)(高職)QQ:81505050周蘇教授QQ:81505050項(xiàng)目3
鍵值數(shù)據(jù)庫(kù)周蘇教授QQ:81505050任務(wù)3.1掌握鍵值數(shù)據(jù)庫(kù)基礎(chǔ)目錄0102從數(shù)組到鍵值數(shù)據(jù)庫(kù)鍵值數(shù)據(jù)庫(kù)的重要特性0304鍵:有意義的標(biāo)識(shí)符值:存放任意數(shù)據(jù)05鍵值數(shù)據(jù)庫(kù)的數(shù)學(xué)建模06鍵值數(shù)據(jù)庫(kù)的架構(gòu)07Redis鍵值數(shù)據(jù)庫(kù)Redis是一個(gè)典型的鍵值數(shù)據(jù)庫(kù),我們從構(gòu)建一個(gè)簡(jiǎn)單的鍵值數(shù)據(jù)庫(kù)SimpleKV(KV:鍵-值)著手,在深入理解Redis之前,先對(duì)它的總體架構(gòu)和關(guān)鍵模塊有一個(gè)了解。圖3-1RedisLogo【導(dǎo)讀案例】Redis鍵值數(shù)據(jù)庫(kù)的基本架構(gòu)開(kāi)始構(gòu)造SimpleKV時(shí),首先要考慮里面可以存什么樣的數(shù)據(jù),對(duì)數(shù)據(jù)可以做什么樣的操作,也就是數(shù)據(jù)模型和操作接口。它們看似簡(jiǎn)單,實(shí)際上卻是我們理解Redis之所以經(jīng)常被用于緩存、秒殺、分布式鎖等場(chǎng)景的重要基礎(chǔ)。理解了數(shù)據(jù)模型,就會(huì)明白為什么在有些場(chǎng)景下,原先使用關(guān)系型數(shù)據(jù)庫(kù)保存的數(shù)據(jù),也可以用鍵值數(shù)據(jù)庫(kù)保存。例如,用戶(hù)信息(ID、姓名、年齡、性別等)通常用關(guān)系型數(shù)據(jù)庫(kù)保存,在這個(gè)場(chǎng)景下,一個(gè)ID對(duì)應(yīng)一個(gè)用戶(hù)信息集合,這就是鍵值數(shù)據(jù)庫(kù)完成存儲(chǔ)需求的一種數(shù)據(jù)模型。但是,如果你只知道數(shù)據(jù)模型,而不了解操作接口的話(huà),可能就無(wú)法理解,為什么在有些場(chǎng)景中,使用鍵值數(shù)據(jù)庫(kù)又不合適了。例如,在上面場(chǎng)景中,如果你要對(duì)多個(gè)用戶(hù)的年齡計(jì)算均值,鍵值數(shù)據(jù)庫(kù)就無(wú)法完成了。因?yàn)樗惶峁┖?jiǎn)單的操作接口,無(wú)法支持復(fù)雜的聚合計(jì)算?!緦?dǎo)讀案例】Redis鍵值數(shù)據(jù)庫(kù)的基本架構(gòu)那么,Redis到底能做什么,不能做什么呢?只有先搞懂它的數(shù)據(jù)模型和操作接口??梢源婺男?shù)據(jù)?鍵值數(shù)據(jù)庫(kù)的基本數(shù)據(jù)模型是key-value模型。例如,“hello”:“world”就是一個(gè)基本的KV對(duì),其中,“hello”是key,“world”是value。在SimpleKV中,key是String類(lèi)型,而value是基本數(shù)據(jù)類(lèi)型,例如String、整型等。實(shí)際應(yīng)用中,鍵值數(shù)據(jù)庫(kù)的value還可以是復(fù)雜類(lèi)型?!緦?dǎo)讀案例】Redis鍵值數(shù)據(jù)庫(kù)的基本架構(gòu)不同鍵值數(shù)據(jù)庫(kù)支持的key類(lèi)型一般差異不大,而value類(lèi)型則有較大差別。在對(duì)鍵值數(shù)據(jù)庫(kù)進(jìn)行選型時(shí),一個(gè)重要的考慮因素是它支持的value類(lèi)型。例如,Memcached支持的value僅為String類(lèi)型,而Redis支持的value類(lèi)型包括了String、哈希(散列)表、列表、集合等。Redis能夠得到廣泛應(yīng)用,就得益于支持多樣化類(lèi)型的value。不同value類(lèi)型的實(shí)現(xiàn)不僅可以支撐不同業(yè)務(wù)的數(shù)據(jù)需求,也隱含著不同數(shù)據(jù)結(jié)構(gòu)在性能、空間效率等方面的差異,從而導(dǎo)致不同的value操作之間的差異。只有深入地理解了這背后的原理,才能在選擇Redisvalue類(lèi)型和優(yōu)化Redis性能時(shí)做到游刃有余?!緦?dǎo)讀案例】Redis鍵值數(shù)據(jù)庫(kù)的基本架構(gòu)可以對(duì)數(shù)據(jù)做什么操作?知道了數(shù)據(jù)模型,接下來(lái)就要看它對(duì)數(shù)據(jù)的基本操作了。SimpleKV是一個(gè)簡(jiǎn)單的鍵值數(shù)據(jù)庫(kù),因此,基本操作不外乎增刪改查。我們先來(lái)了解SimpleKV需要支持的3種基本操作,即PUT、GET和DELETE。PUT:新寫(xiě)入或更新一個(gè)key-value對(duì);GET:根據(jù)一個(gè)key讀取相應(yīng)的value值;DELETE:根據(jù)一個(gè)key刪除整個(gè)key-value對(duì)。需要注意的是,有些鍵值數(shù)據(jù)庫(kù)的寫(xiě)/更新操作叫SET。寫(xiě)入和更新雖然是用一個(gè)操作接口,但在實(shí)際執(zhí)行時(shí),會(huì)根據(jù)key是否存在而執(zhí)行相應(yīng)的寫(xiě)或更新流程?!緦?dǎo)讀案例】Redis鍵值數(shù)據(jù)庫(kù)的基本架構(gòu)實(shí)際業(yè)務(wù)場(chǎng)景中經(jīng)常會(huì)碰到這種情況:查詢(xún)一個(gè)用戶(hù)在一段時(shí)間內(nèi)的訪(fǎng)問(wèn)記錄。這種操作在鍵值數(shù)據(jù)庫(kù)中屬于SCAN操作,即根據(jù)一段key的范圍返回相應(yīng)的value值。因此,PUT、GET、DELETE、SCAN是一個(gè)鍵值數(shù)據(jù)庫(kù)的基本操作集合。此外,實(shí)際業(yè)務(wù)場(chǎng)景通常還有更加豐富的需求,例如,在黑白名單應(yīng)用中,需要判斷某個(gè)用戶(hù)是否存在。如果將該用戶(hù)的ID作為key,那么,可以增加EXISTS操作接口,用于判斷某個(gè)key是否存在。對(duì)于一個(gè)具體的鍵值數(shù)據(jù)庫(kù)而言,可以通過(guò)查看操作文檔,了解其詳細(xì)的操作接口。當(dāng)然,當(dāng)一個(gè)鍵值數(shù)據(jù)庫(kù)的value類(lèi)型多樣化時(shí),就需要包含相應(yīng)的操作接口。例如,Redis的value有列表類(lèi)型,因此它的接口就要包括對(duì)列表value的操作?!緦?dǎo)讀案例】Redis鍵值數(shù)據(jù)庫(kù)的基本架構(gòu)至此,我們構(gòu)造完成了數(shù)據(jù)模型和操作接口。接下來(lái),考慮一個(gè)非常重要的設(shè)計(jì)問(wèn)題:鍵值對(duì)保存在內(nèi)存還是外存?保存在內(nèi)存的好處是讀寫(xiě)很快,畢竟內(nèi)存的訪(fǎng)問(wèn)速度一般都在百ns級(jí)別。但是,潛在的風(fēng)險(xiǎn)是一旦掉電,所有的數(shù)據(jù)都會(huì)丟失。保存在外存雖然可以避免數(shù)據(jù)丟失,但是受限于磁盤(pán)的慢速讀寫(xiě)(通常在幾ms級(jí)別),鍵值數(shù)據(jù)庫(kù)的整體性能會(huì)被拉低。因此,如何選擇,通常需要考慮鍵值數(shù)據(jù)庫(kù)的主要應(yīng)用場(chǎng)景。比如,緩存場(chǎng)景下的數(shù)據(jù)需要能快速訪(fǎng)問(wèn)但允許丟失,那么,用于此場(chǎng)景的鍵值數(shù)據(jù)庫(kù)通常采用內(nèi)存保存鍵值數(shù)據(jù),Memcached和Redis都屬于內(nèi)存鍵值數(shù)據(jù)庫(kù)。對(duì)于Redis而言,緩存是非常重要的一個(gè)應(yīng)用場(chǎng)景?!緦?dǎo)讀案例】Redis鍵值數(shù)據(jù)庫(kù)的基本架構(gòu)為了和Redis保持一致,SimpleKV采用內(nèi)存保存鍵值數(shù)據(jù)。我們接著來(lái)了解SimpleKV的基本組件。大體來(lái)說(shuō),一個(gè)鍵值數(shù)據(jù)庫(kù)包括了訪(fǎng)問(wèn)框架、索引模塊、操作模塊和存儲(chǔ)模塊四部分,我們就從這四個(gè)部分入手構(gòu)建SimpleKV。圖3-2基本內(nèi)部架構(gòu):從SimpleKV(左)到Redis【導(dǎo)讀案例】Redis鍵值數(shù)據(jù)庫(kù)的基本架構(gòu)采用什么訪(fǎng)問(wèn)模式?訪(fǎng)問(wèn)模式通常有兩種:一種是通過(guò)函數(shù)庫(kù)調(diào)用方式供外部應(yīng)用使用。比如圖3-2中的libsimplekv.so就是以動(dòng)態(tài)鏈接庫(kù)的形式鏈接到程序中,提供鍵值存儲(chǔ)功能。另一種是通過(guò)網(wǎng)絡(luò)框架,以Socket通信的形式對(duì)外提供鍵值對(duì)操作,這種形式可以提供廣泛的鍵值存儲(chǔ)服務(wù)。在圖3-2中可以看到,網(wǎng)絡(luò)框架中包括SocketServer和協(xié)議解析。不同的鍵值數(shù)據(jù)庫(kù)服務(wù)器和客戶(hù)端交互的協(xié)議并不相同,在對(duì)鍵值數(shù)據(jù)庫(kù)進(jìn)行二次開(kāi)發(fā)、新增功能時(shí),必須要了解和掌握鍵值數(shù)據(jù)庫(kù)的通信協(xié)議,這樣才能開(kāi)發(fā)出兼容的客戶(hù)端?!緦?dǎo)讀案例】Redis鍵值數(shù)據(jù)庫(kù)的基本架構(gòu)鍵值數(shù)據(jù)庫(kù)基本采用上述兩種方式。例如RocksDB以動(dòng)態(tài)鏈接庫(kù)的形式使用,而Memcached和Redis則是通過(guò)網(wǎng)絡(luò)框架訪(fǎng)問(wèn)。通過(guò)網(wǎng)絡(luò)框架提供鍵值存儲(chǔ)服務(wù),一方面擴(kuò)大了鍵值數(shù)據(jù)庫(kù)的受用面,另一方面也給鍵值數(shù)據(jù)庫(kù)的性能、運(yùn)行模型提供了不同的設(shè)計(jì)選擇,帶來(lái)了一些潛在的問(wèn)題。例如,當(dāng)客戶(hù)端發(fā)送如下命令后,該命令會(huì)被封裝在網(wǎng)絡(luò)包中發(fā)送給鍵值數(shù)據(jù)庫(kù):PUThelloworld【導(dǎo)讀案例】Redis鍵值數(shù)據(jù)庫(kù)的基本架構(gòu)鍵值數(shù)據(jù)庫(kù)網(wǎng)絡(luò)框架接收到網(wǎng)絡(luò)包,并按照相應(yīng)的協(xié)議進(jìn)行解析之后,就可以知道客戶(hù)端想寫(xiě)入一個(gè)鍵值對(duì),并開(kāi)始實(shí)際的寫(xiě)入流程。此時(shí)會(huì)遇到一個(gè)系統(tǒng)設(shè)計(jì)上的問(wèn)題,簡(jiǎn)單來(lái)說(shuō),就是網(wǎng)絡(luò)連接的處理、網(wǎng)絡(luò)請(qǐng)求的解析以及數(shù)據(jù)存取的處理,是用一個(gè)線(xiàn)程、多個(gè)線(xiàn)程,還是多個(gè)進(jìn)程來(lái)交互處理呢?該如何進(jìn)行設(shè)計(jì)和取舍呢?我們一般把這個(gè)問(wèn)題稱(chēng)為I/O模型設(shè)計(jì)。不同的I/O模型對(duì)鍵值數(shù)據(jù)庫(kù)的性能和可擴(kuò)展性會(huì)有不同的影響?!緦?dǎo)讀案例】Redis鍵值數(shù)據(jù)庫(kù)的基本架構(gòu)例如,如果一個(gè)線(xiàn)程既要處理網(wǎng)絡(luò)連接、解析請(qǐng)求,又要完成數(shù)據(jù)存取,一旦某一步操作發(fā)生阻塞,整個(gè)線(xiàn)程就會(huì)被阻塞,這就降低了系統(tǒng)響應(yīng)速度。如果采用不同線(xiàn)程處理不同操作,那么,某個(gè)線(xiàn)程被阻塞時(shí),其他線(xiàn)程還能正常運(yùn)行。但是,不同線(xiàn)程間如果需要訪(fǎng)問(wèn)共享資源,那又會(huì)產(chǎn)生線(xiàn)程競(jìng)爭(zhēng)而影響系統(tǒng)效率,這又該怎么辦呢?所以,這是個(gè)“兩難”選擇,需要我們進(jìn)行精心的設(shè)計(jì)。你可能經(jīng)常聽(tīng)說(shuō)Redis是單線(xiàn)程,那么,Redis又是如何做到“單線(xiàn)程,高性能”的呢?【導(dǎo)讀案例】Redis鍵值數(shù)據(jù)庫(kù)的基本架構(gòu)如何定位鍵值對(duì)的位置?當(dāng)SimpleKV解析了客戶(hù)端發(fā)來(lái)的請(qǐng)求,知道了要進(jìn)行的鍵值對(duì)操作,此時(shí),SimpleKV需要查找所要操作的鍵值對(duì)是否存在,這依賴(lài)于鍵值數(shù)據(jù)庫(kù)的索引模塊。索引的作用是讓鍵值數(shù)據(jù)庫(kù)根據(jù)key找到相應(yīng)value的存儲(chǔ)位置,進(jìn)而執(zhí)行操作。索引的類(lèi)型有很多,常見(jiàn)的有哈希表、B+樹(shù)、字典樹(shù)等。不同的索引結(jié)構(gòu)在性能、空間消耗、并發(fā)控制等方面具有不同的特征。不同鍵值數(shù)據(jù)庫(kù)采用的索引各不相同,例如,Memcached和Redis采用哈希表作為key-value索引,而RocksDB則采用跳表作為內(nèi)存中key-value的索引?!緦?dǎo)讀案例】Redis鍵值數(shù)據(jù)庫(kù)的基本架構(gòu)一般而言,內(nèi)存鍵值數(shù)據(jù)庫(kù)(例如Redis)采用哈希表作為索引,很大一部分原因在于,其鍵值數(shù)據(jù)基本都是保存在內(nèi)存中的,而內(nèi)存的高性能隨機(jī)訪(fǎng)問(wèn)特性可以很好地與哈希表O(1)的操作復(fù)雜度相匹配。Redis采用一些常見(jiàn)的高效索引結(jié)構(gòu)作為某些value類(lèi)型的底層數(shù)據(jù)結(jié)構(gòu),這一技術(shù)路線(xiàn)為Redis實(shí)現(xiàn)高性能訪(fǎng)問(wèn)提供了良好的支撐?!緦?dǎo)讀案例】Redis鍵值數(shù)據(jù)庫(kù)的基本架構(gòu)(1)由數(shù)組入手認(rèn)識(shí)鍵值數(shù)據(jù)庫(kù),熟悉鍵值數(shù)組數(shù)據(jù)結(jié)構(gòu),熟悉鍵值數(shù)據(jù)庫(kù)重要特性。(2)熟悉鍵與值,掌握鍵值數(shù)據(jù)庫(kù)的數(shù)據(jù)建模方法,熟悉鍵值數(shù)據(jù)庫(kù)的架構(gòu)。(3)了解典型的鍵值數(shù)據(jù)庫(kù)Redis?!救蝿?wù)描述】
從數(shù)組到鍵值數(shù)據(jù)庫(kù)鍵值數(shù)據(jù)庫(kù)是最簡(jiǎn)單的一種NoSQL數(shù)據(jù)庫(kù),它根據(jù)鍵來(lái)存儲(chǔ)數(shù)據(jù),而這個(gè)鍵就是數(shù)據(jù)的標(biāo)識(shí)符。Bigdatastorageandmanagement鍵值數(shù)據(jù)庫(kù)是最簡(jiǎn)單的一種NoSQL數(shù)據(jù)庫(kù),它根據(jù)鍵來(lái)存儲(chǔ)數(shù)據(jù),而這個(gè)鍵就是數(shù)據(jù)的標(biāo)識(shí)符。鍵值型數(shù)據(jù)結(jié)構(gòu)可以看成是一種比較復(fù)雜的數(shù)組型數(shù)據(jù)結(jié)構(gòu)。數(shù)組本來(lái)是一種簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),但由于放寬了對(duì)該結(jié)構(gòu)的諸多限制,并為其補(bǔ)充了與數(shù)據(jù)存儲(chǔ)有關(guān)的一些特性,因此,這個(gè)數(shù)組的概念所覆蓋的范圍被放大了,它現(xiàn)在可以包括其他很多有用的數(shù)據(jù)結(jié)構(gòu),諸如關(guān)聯(lián)數(shù)組、緩存以及鍵值數(shù)據(jù)庫(kù)等。3.1.1從數(shù)組到鍵值數(shù)據(jù)庫(kù)1.數(shù)組通常,專(zhuān)業(yè)學(xué)生首先接觸到的數(shù)據(jù)結(jié)構(gòu)可能就是數(shù)組。除了整數(shù)和字符串這樣的變量之外,數(shù)組應(yīng)該是最簡(jiǎn)單的變量形式。數(shù)組是由整
數(shù)值或者是由字符或布爾值所構(gòu)成的有序列表,其中
的每個(gè)值都與一個(gè)整數(shù)下標(biāo)(也稱(chēng)為索引)相關(guān)聯(lián),
這些值的類(lèi)型相同。右圖就是一個(gè)含有10個(gè)布爾元素
的數(shù)組。
圖3-3數(shù)組是由元素構(gòu)成的有序列表3.1.1從數(shù)組到鍵值數(shù)據(jù)庫(kù)讀取和設(shè)置數(shù)組元素值的具體代碼,其寫(xiě)法與所使用的編程語(yǔ)言有關(guān)。例如,我們采用下面這種寫(xiě)法來(lái)讀取exampleArray的首個(gè)元素(其下標(biāo)通常是0而不是1):exampleArray[0]要設(shè)置數(shù)組中某個(gè)元素的值,先寫(xiě)該元素的代碼,然后寫(xiě)賦值符號(hào)(“=”),接著寫(xiě)出要給該元素所賦的新值。例如:exampleArray[0]='Helloworld.'3.1.1從數(shù)組到鍵值數(shù)據(jù)庫(kù)上面這行語(yǔ)句可以把exampleArray數(shù)組的首個(gè)元素設(shè)為字符串值“Helloworld”。數(shù)組中的其他元素也可以用下面這些語(yǔ)句來(lái)賦值:exampleArray[1]='GoodbyeWorld.'exampleArray[2]='Thisisatest.'exampleArray[5]='Key-valuedatabase'exampleArray[9]='Elementscanbesetinanyorder.'3.1.1從數(shù)組到鍵值數(shù)據(jù)庫(kù)exampleArray數(shù)組中的每個(gè)元素都是由字符所構(gòu)成的字符串,不能把該數(shù)組的元素設(shè)為其他類(lèi)型的值。由此可見(jiàn),使用數(shù)組會(huì)有下面兩項(xiàng)限制:(1)下標(biāo)只能是整數(shù);(2)所有的值都必須是同一類(lèi)型。但有的時(shí)候,人們可能需要使用一種不受這兩項(xiàng)限制的數(shù)據(jù)結(jié)構(gòu)。3.1.1從數(shù)組到鍵值數(shù)據(jù)庫(kù)2.關(guān)聯(lián)數(shù)組關(guān)聯(lián)數(shù)組和普通數(shù)組一樣也是一種數(shù)據(jù)結(jié)構(gòu),但它的下標(biāo)并不限于整數(shù),也不要求所有的值都必須是同一類(lèi)型。比方說(shuō),可以用下面這些語(yǔ)句來(lái)操作關(guān)聯(lián)數(shù)組:exampleAssociativeArray['Pi']=3.1415exampleAssociativeArray['CapitalFrance']='Paris'exampleAssociativeArray['ToDoList']={'Alice':'runreports;meetingwithBob':'Bob':'orderinventory;meetingwithAlice'}exampleAssociativeArray[17234]=366483.1.1從數(shù)組到鍵值數(shù)據(jù)庫(kù)關(guān)聯(lián)數(shù)組是對(duì)數(shù)組概念的泛化,它的標(biāo)識(shí)符和元素值不像普通數(shù)組那樣嚴(yán)格。關(guān)聯(lián)數(shù)組還有一些別名,如字典、映射、哈希(散列)映射(哈希圖)、哈希表、符號(hào)表等。從上面代碼段可以看出,關(guān)聯(lián)數(shù)組的鍵相當(dāng)于數(shù)組的下標(biāo)或索引,它既可以是字符串,也可以是整數(shù)。有些編程語(yǔ)言或數(shù)據(jù)庫(kù)還允許使用數(shù)值列表等更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)來(lái)做鍵。關(guān)聯(lián)數(shù)組中值的類(lèi)型也可以彼此不同。在上面例子中,數(shù)組里的那些元素值分別是實(shí)數(shù)、字符串、列表及整數(shù)等不同類(lèi)型。與這些元素值
相關(guān)聯(lián)的標(biāo)識(shí)符一般稱(chēng)為鍵。關(guān)聯(lián)數(shù)組是鍵值數(shù)據(jù)庫(kù)在
底層所使用的基本數(shù)據(jù)結(jié)構(gòu)。3.1.1從數(shù)組到鍵值數(shù)據(jù)庫(kù)3.緩存數(shù)據(jù)存儲(chǔ)在概念上和數(shù)據(jù)庫(kù)類(lèi)似,有時(shí)也用來(lái)指代包含數(shù)據(jù)庫(kù)在內(nèi)的各種數(shù)據(jù)保存形式。緩存也是一種鍵值數(shù)據(jù)存儲(chǔ)機(jī)制。鍵值數(shù)據(jù)庫(kù)是根據(jù)關(guān)聯(lián)數(shù)組這一概念而構(gòu)建的。許多鍵值型數(shù)據(jù)存儲(chǔ)機(jī)制會(huì)把數(shù)據(jù)副本保存在硬盤(pán)或閃存盤(pán)等長(zhǎng)期存儲(chǔ)介質(zhì)之中,而另外一些鍵值型數(shù)據(jù)存儲(chǔ)機(jī)制則會(huì)在內(nèi)存中保留數(shù)據(jù)。程序可以通過(guò)后一種數(shù)據(jù)存儲(chǔ)機(jī)制來(lái)快速獲取數(shù)據(jù),這樣做要比通過(guò)磁盤(pán)驅(qū)動(dòng)器來(lái)獲取數(shù)據(jù)更為迅捷。初次獲取數(shù)
據(jù)時(shí),可以通過(guò)SQL查詢(xún)語(yǔ)句從磁盤(pán)中的關(guān)系型數(shù)據(jù)庫(kù)
里查出想要的結(jié)果,然后把查到的結(jié)果與相關(guān)的一組鍵
名同時(shí)存儲(chǔ)在緩存里面,這些鍵名在緩存中是唯一的。3.1.1從數(shù)組到鍵值數(shù)據(jù)庫(kù)如果程序比較簡(jiǎn)單,每次只需記錄一位顧客的信息,那么可以使用字符串變量來(lái)保存該顧客的姓名及地址。若是程序需要同時(shí)記錄多位顧客及其他一些實(shí)體,使用緩存會(huì)更加合適。內(nèi)存中的緩存是一種關(guān)聯(lián)數(shù)組。從關(guān)系型數(shù)據(jù)庫(kù)里獲取一些值之后,可以根據(jù)每個(gè)值來(lái)創(chuàng)建對(duì)應(yīng)的鍵,并把這些鍵值對(duì)放到緩存中。對(duì)于每位顧客的每項(xiàng)數(shù)據(jù)來(lái)說(shuō),若想保證這些鍵名彼此不重復(fù),一種辦法是把某個(gè)獨(dú)特的標(biāo)識(shí)符與該項(xiàng)數(shù)據(jù)的名稱(chēng)合起來(lái)當(dāng)作鍵名。3.1.1從數(shù)組到鍵值數(shù)據(jù)庫(kù)比方說(shuō),下面這些語(yǔ)句可以把從數(shù)據(jù)庫(kù)里獲取到的信息放入內(nèi)存的緩存里面:customerCache['1982737:firstname']=firstNamecustomerCache['1982737:lastname']=lastNamecustomerCache['1982737:shippingAddress']=shippingAddresscustomerCache['1982737:shippingCity']=shippingCitycustomerCache['1982737:shippingState']=shippingStatecustomerCache['1982737:shippingZip']=shippingZip由于把customerID的值用作鍵名的一部分,因此緩存可以存放許多顧客的數(shù)據(jù),不需要給每位顧客的那一組數(shù)據(jù)都單獨(dú)起一個(gè)變量名,而是把它們?nèi)糠旁赾ustomerCache關(guān)聯(lián)數(shù)組中。程序在查詢(xún)顧客的數(shù)據(jù)時(shí),一般會(huì)先試著從緩存里面獲取,如果緩存中找不到再去查詢(xún)數(shù)據(jù)庫(kù)。3.1.1從數(shù)組到鍵值數(shù)據(jù)庫(kù)4.鍵值數(shù)據(jù)庫(kù)鍵值數(shù)據(jù)庫(kù)又稱(chēng)鍵-值對(duì)數(shù)據(jù)庫(kù),是指那種能夠持久保存數(shù)據(jù)的鍵值存儲(chǔ)機(jī)制。對(duì)于需要多次查詢(xún)數(shù)據(jù)庫(kù)的應(yīng)用程序來(lái)說(shuō),緩存能夠提升其效率。鍵值數(shù)據(jù)存儲(chǔ)機(jī)制如果還能夠把數(shù)據(jù)持久地保存在磁盤(pán)、閃存盤(pán)等其他長(zhǎng)期存儲(chǔ)設(shè)備之中,那將會(huì)變得更為有用。這樣的鍵值存儲(chǔ)機(jī)制,既具備高效的緩存,又帶有能夠持久存放數(shù)據(jù)的數(shù)據(jù)庫(kù)。如果開(kāi)發(fā)者想要更為方便地存儲(chǔ)并獲取數(shù)據(jù),而不追求表格等較為復(fù)雜的數(shù)據(jù)結(jié)構(gòu),可以考慮使用鍵值數(shù)據(jù)庫(kù)。3.1.1從數(shù)組到鍵值數(shù)據(jù)庫(kù)制定好鍵名的規(guī)范之后,可以編寫(xiě)一系列函數(shù),以便在鍵值數(shù)據(jù)庫(kù)中模擬表格的創(chuàng)建、讀取、更新及刪除操作。比方說(shuō),下面這個(gè)用偽代碼寫(xiě)成的create函數(shù),就可以模擬出在表格中創(chuàng)建新行的操作:defineaddCustomerRow(p_tableName,p_primaryKey,p_firstName,p_lastName,p_shippingAddress,p_shippingCity,p_shippingState,p_shippingZip)begin;set[p_tableName+p_primary+'firstName']=p_firstName;set[p_tableName+p_primary+'lastName']=p_lastName;set[p_tableName+p_primary+'shippingAddress']=p_shippingAddress;3.1.1從數(shù)組到鍵值數(shù)據(jù)庫(kù)set[p_tableName+p_primary+'shippingCity']=p_shippingCity;set[p_tableName+p_primary+'shippingState']=p_shippingState;set[p_tableName+p_primary+'shippingZip']=p_shippimgZip;end;依此,也可以寫(xiě)出完成讀取、更新及刪除操作的那些函數(shù)。3.1.1從數(shù)組到鍵值數(shù)據(jù)庫(kù)以鍵值數(shù)據(jù)庫(kù)為基礎(chǔ),開(kāi)發(fā)者很容易就能實(shí)現(xiàn)網(wǎng)狀或表格狀的數(shù)據(jù)結(jié)構(gòu)??梢灾贫ㄒ环N鍵名規(guī)范,把表格名稱(chēng)、主鍵值以及屬性名稱(chēng)合起來(lái)當(dāng)作鍵名,以保存與之關(guān)聯(lián)的屬性。例如:Customer:1982737:firstNameCustomer:1982737:lastNameCustomer:1982737:shippingAddressCustomer:1982737:ghippingCityCustomer:1982737:shippingStateCustomer:1982737:shippingZip3.1.1從數(shù)組到鍵值數(shù)據(jù)庫(kù)3.1.2
鍵值數(shù)據(jù)庫(kù)的重要特性鍵值數(shù)據(jù)庫(kù)具有三個(gè)重要特性,即簡(jiǎn)潔、高速和易于縮放。Bigdatastorageandmanagement鍵值數(shù)據(jù)庫(kù)具有三個(gè)重要特性,即簡(jiǎn)潔、高速和易于縮放。不過(guò),為了實(shí)現(xiàn)這三項(xiàng)非常有用的特性,數(shù)據(jù)庫(kù)必須接受一些限制。3.1.2鍵值數(shù)據(jù)庫(kù)的重要特性1.簡(jiǎn)潔:不需要設(shè)計(jì)復(fù)雜數(shù)據(jù)模型鍵值數(shù)據(jù)庫(kù)使用了功能極其簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),這是因?yàn)槌3S貌坏疥P(guān)系型數(shù)據(jù)庫(kù)所提供的那些附加功能。比方說(shuō),文字處理軟件MicrosoftWord具備很多強(qiáng)大的功能,它提供了一大堆文本格式化選項(xiàng),具備拼寫(xiě)檢查及語(yǔ)法檢查功能,而且還可以和引用資料管理器與參考書(shū)目管理器等工具相集成。如果要寫(xiě)一部書(shū)或一篇較長(zhǎng)的論文,那就應(yīng)該使用這種功能豐富的文字處理軟件。但是,如果只想在手機(jī)上編輯一份僅含6個(gè)條目的待辦事務(wù)列表,那么一個(gè)簡(jiǎn)單的文本編輯
器就足夠了。3.1.2鍵值數(shù)據(jù)庫(kù)的重要特性一般來(lái)說(shuō),開(kāi)發(fā)者都用不到表格的join操作,而且也不會(huì)同時(shí)查詢(xún)數(shù)據(jù)庫(kù)里的許多種實(shí)體。如果要用數(shù)據(jù)庫(kù)來(lái)保存與顧客購(gòu)物車(chē)有關(guān)的數(shù)據(jù),使用鍵值數(shù)據(jù)庫(kù)會(huì)更簡(jiǎn)單一些。寫(xiě)好程序之后,如果發(fā)現(xiàn)還需要在鍵值數(shù)據(jù)庫(kù)中保存其他―些屬性,那就直接把相關(guān)的代碼添加到程序中即可。,新的屬性可以直接添加到鍵值數(shù)據(jù)庫(kù)中。鍵值數(shù)據(jù)庫(kù)使用的數(shù)據(jù)模型非常簡(jiǎn)單,操作數(shù)據(jù)所需的代碼寫(xiě)起來(lái)也很容易。如果想操作某個(gè)鍵值對(duì),向鍵值數(shù)據(jù)庫(kù)提供鍵名,數(shù)據(jù)庫(kù)就會(huì)告訴我們與該鍵相關(guān)聯(lián)的值。鍵值數(shù)據(jù)庫(kù)使用起來(lái)比較靈活,規(guī)則也比較寬松。例如,在下面這段代碼中,同時(shí)使用了數(shù)字及字符串這兩種值來(lái)做顧客標(biāo)識(shí)符:shoppingCart[cart:1298:customerID]=1982737shoppingCart[cart:3985:customerID]='Johnson,Louise'3.1.2鍵值數(shù)據(jù)庫(kù)的重要特性2.速度:越快越好由于使用了簡(jiǎn)單的關(guān)聯(lián)數(shù)組做數(shù)據(jù)結(jié)構(gòu),又為提升操作速度進(jìn)行了一些優(yōu)化,因此,鍵值數(shù)據(jù)庫(kù)能夠應(yīng)對(duì)高吞吐量的數(shù)據(jù)密集型操作。鍵值數(shù)據(jù)庫(kù)既可以利用RAM實(shí)現(xiàn)快速的寫(xiě)入操作,又可以利用磁盤(pán)實(shí)現(xiàn)持久化的數(shù)據(jù)存儲(chǔ)。程序如果修改了與某個(gè)鍵相關(guān)聯(lián)的值,那么鍵值數(shù)據(jù)庫(kù)就會(huì)更新RAM中的相應(yīng)條目,然后向程序發(fā)送消息,告知該值已經(jīng)更新。程序可以繼續(xù)進(jìn)行其他操作。當(dāng)程序在執(zhí)行其他操作的時(shí)候,鍵值數(shù)據(jù)庫(kù)可以
把最近更新的值寫(xiě)入磁盤(pán)之中。從應(yīng)用程序更新該值起,
至鍵值數(shù)據(jù)庫(kù)將其存儲(chǔ)到磁盤(pán)中為止,這中間只要不發(fā)
生斷電或其他故障,新值就可以順利地保存到磁盤(pán)里。3.1.2鍵值數(shù)據(jù)庫(kù)的重要特性由于數(shù)據(jù)庫(kù)的大小可能會(huì)超過(guò)內(nèi)存容量,所以鍵值數(shù)據(jù)庫(kù)必須設(shè)法對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行管理。對(duì)數(shù)據(jù)進(jìn)行壓縮,可以提升內(nèi)存中所能保留的數(shù)據(jù)量。當(dāng)鍵值數(shù)據(jù)庫(kù)得到一塊內(nèi)存之后,數(shù)據(jù)庫(kù)系統(tǒng)有時(shí)需要先釋放這塊內(nèi)存中的某些數(shù)據(jù),以便存儲(chǔ)新數(shù)據(jù)的副本。有很多算法都可以用來(lái)決定數(shù)據(jù)庫(kù)所應(yīng)釋放的數(shù)據(jù),其中最常用的一種叫做LRU(最久未使用)算法。3.1.2鍵值數(shù)據(jù)庫(kù)的重要特性3.易于縮放:隨時(shí)應(yīng)對(duì)訪(fǎng)問(wèn)量的變化鍵值數(shù)據(jù)庫(kù)必須能在盡量不影響操作的情況下進(jìn)行縮放,以應(yīng)對(duì)Web應(yīng)用程序和其他大規(guī)模應(yīng)用程序的需求??煽s放性就是在服務(wù)器集群中根據(jù)系統(tǒng)的負(fù)載量,隨時(shí)添加或移除服務(wù)器的能力。在對(duì)數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行縮放時(shí),數(shù)據(jù)庫(kù)對(duì)讀取操作和寫(xiě)入操作的協(xié)調(diào)能力是一項(xiàng)很重要的性質(zhì)。鍵值數(shù)據(jù)庫(kù)可以采用不同的方式來(lái)針對(duì)讀取操作和寫(xiě)入操作進(jìn)行縮放。3.1.2鍵值數(shù)據(jù)庫(kù)的重要特性
鍵:有意義的標(biāo)識(shí)符鍵(key)是指向值的引用,它與地址的概念類(lèi)似。Bigdatastorageandmanagement鍵(key)是指向值的引用,它與地址的概念類(lèi)似?!版I本身不是值,但卻提供了找尋與操縱相關(guān)值的方式。鍵所具備的―項(xiàng)基本屬性就是在所處的命名空間內(nèi),它的名稱(chēng)是唯一的。3.1.3鍵:有意義的標(biāo)識(shí)符1.構(gòu)造鍵名在不同的鍵值數(shù)據(jù)庫(kù)中,鍵可以表現(xiàn)為不同的形式。Redis等鍵值數(shù)據(jù)庫(kù)可以用更復(fù)雜的結(jié)構(gòu)做鍵,它支持的鍵類(lèi)型包括:字符串、列表、集、有序集、哈希映射、位數(shù)組。Redis開(kāi)發(fā)者把鍵值數(shù)據(jù)庫(kù)稱(chēng)為數(shù)據(jù)結(jié)構(gòu)服務(wù)器。列表(list)是由字符串所構(gòu)成的有序集合。集(set)是由互不相同的元素以不特定的順序所構(gòu)成的集合。有序集(sortedset)是由互不相同的元素按照特定順序所構(gòu)成的集合。哈希(hash)映射是一種帶有鍵值型特征的數(shù)據(jù)結(jié)構(gòu),它們能夠把一個(gè)字符串映射為另外一個(gè)字符串。位數(shù)組(bitarray)是由二進(jìn)制整數(shù)所構(gòu)成的數(shù)組,可以使用與位數(shù)組有關(guān)的多種操作來(lái)分別處理其中的每一個(gè)二進(jìn)制位。3.1.3鍵:有意義的標(biāo)識(shí)符構(gòu)造鍵名的時(shí)候應(yīng)該遵循一套固定的命名規(guī)范。比方說(shuō),可以把實(shí)體類(lèi)型、特定實(shí)體的獨(dú)特標(biāo)識(shí)符以及屬性名稱(chēng)拼接起來(lái)充當(dāng)鍵名。表示鍵名的字符串不應(yīng)該太長(zhǎng),以避免使用很多內(nèi)存,同時(shí)鍵名也不要起得太短,以避免引發(fā)歧義。可以考慮把與屬性有關(guān)的信息囊括進(jìn)來(lái),使鍵名變得更有意義。構(gòu)造鍵名的時(shí)候可以把實(shí)體類(lèi)型、實(shí)體標(biāo)識(shí)符以及實(shí)體屬性等信息拼接起來(lái),例如: Cust:12387:firstName3.1.3鍵:有意義的標(biāo)識(shí)符2.通過(guò)鍵來(lái)定位相關(guān)的值鍵值數(shù)據(jù)庫(kù)的設(shè)計(jì)者更關(guān)心如何設(shè)計(jì)出實(shí)用的數(shù)據(jù)庫(kù),而不是如何簡(jiǎn)化訪(fǎng)問(wèn)數(shù)據(jù)所用的代碼。可以用數(shù)字來(lái)定位相關(guān)的值,但這還不夠靈活。應(yīng)該能夠使用整數(shù)、字符串乃至對(duì)象列表做鍵,辦法就是用一種函數(shù)把整數(shù)、字符串或?qū)ο罅斜碛成涑瑟?dú)特的字符串或數(shù)字。像這樣能夠把某一類(lèi)值映射為相關(guān)數(shù)字的函數(shù),就叫做哈希函數(shù)(也稱(chēng)為散列或雜湊)。并非所有鍵值數(shù)據(jù)庫(kù)都支持列表或其他復(fù)雜的結(jié)構(gòu)。某
些鍵值數(shù)據(jù)庫(kù)對(duì)鍵的類(lèi)型和長(zhǎng)度做了比較嚴(yán)格的限制。3.1.3鍵:有意義的標(biāo)識(shí)符(1)哈希函數(shù)將鍵名映射到相關(guān)位置。哈希函數(shù)是一種可以接受任意字符串,并能夠產(chǎn)生一般不會(huì)相互重復(fù)的定長(zhǎng)字符串的函數(shù)。例如,顧客購(gòu)物車(chē)信息可以分別映射成表3-1中的各個(gè)哈希值。表3-1鍵與哈希值之間的映射3.1.3鍵:有意義的標(biāo)識(shí)符雖然這些鍵的前綴都是‘customet:1982737:’,但是用SHA-1哈希函數(shù)映射出來(lái)的哈希值卻有相當(dāng)大的區(qū)別。哈希函數(shù)的一項(xiàng)特性就是要把鍵映射成看上去較為隨機(jī)的一些值。表3-1中的哈希值都是十六進(jìn)制的整數(shù),其總長(zhǎng)度均為40位,所以總共有大約1.4615016e+48個(gè)不同的取值。對(duì)于使用鍵值數(shù)據(jù)庫(kù)的應(yīng)用程序來(lái)說(shuō),這已經(jīng)足夠了。3.1.3鍵:有意義的標(biāo)識(shí)符(2)通過(guò)鍵來(lái)避免重復(fù)寫(xiě)入我們來(lái)看看如何使用哈希函數(shù)返回的數(shù)字,把鍵映射到相關(guān)的位置上。為了簡(jiǎn)化討論,我們只關(guān)注用函數(shù)返回的哈希碼確定與鍵相關(guān)的值應(yīng)該存儲(chǔ)在哪一臺(tái)服務(wù)器上。在實(shí)現(xiàn)的鍵值數(shù)據(jù)庫(kù)中,可能還要把鍵映射到服務(wù)器的磁盤(pán)或內(nèi)存等更為具體的位置上面。假設(shè)有一個(gè)安裝了8臺(tái)服務(wù)器的集群。哈希函數(shù)的好處就在于,它返回的是個(gè)數(shù)字。由于寫(xiě)入請(qǐng)求應(yīng)該平均地分布在這8臺(tái)服務(wù)器上,所以可以給每臺(tái)服務(wù)器安排1/8的負(fù)載量。例如,可以把第一次寫(xiě)入請(qǐng)求交給1號(hào)服務(wù)器來(lái)處理,把第二次寫(xiě)入請(qǐng)求交給2號(hào)服務(wù)器來(lái)處理,把第三次寫(xiě)入請(qǐng)求交給3號(hào)服務(wù)器來(lái)處理,依此類(lèi)推。不過(guò),這種輪流處理的做法并沒(méi)有發(fā)揮出哈希函數(shù)的優(yōu)勢(shì)。3.1.3鍵:有意義的標(biāo)識(shí)符為利用函數(shù)所返回的哈希值,一個(gè)辦法是把該值與服務(wù)器的總數(shù)相除。有的時(shí)候,這個(gè)哈希值可以為服務(wù)器總數(shù)所整除。如果哈希函數(shù)返回的數(shù)字是32,那么32除以8的余數(shù)就是0。如果哈希函數(shù)返回41,那么41除以8的余數(shù)就是1。如果哈希函數(shù)返回67,那么67除以8的余數(shù)就是3。可以發(fā)現(xiàn),除以8之后所剩的余數(shù)總是在0~7之間。于是,就可以把0~7這8個(gè)數(shù)字分別與這8臺(tái)服務(wù)器聯(lián)系起來(lái)。3.1.3鍵:有意義的標(biāo)識(shí)符3.1.4
值:存放任意數(shù)據(jù)鍵值數(shù)據(jù)庫(kù)之所以簡(jiǎn)單,部分原因在于它使用關(guān)聯(lián)數(shù)組作為基本結(jié)構(gòu),而這種結(jié)構(gòu)本身就非常簡(jiǎn)單。Bigdatastorageandmanagement鍵值數(shù)據(jù)庫(kù)中的另一個(gè)組件就是值。鍵值數(shù)據(jù)庫(kù)之所以簡(jiǎn)單,部分原因在于它使用關(guān)聯(lián)數(shù)組作為基本結(jié)構(gòu),而這種結(jié)構(gòu)本身就非常簡(jiǎn)單。NoSQL數(shù)據(jù)庫(kù)保存值的方式也很簡(jiǎn)單。3.1.4值:存放任意數(shù)據(jù)1.值不一定要有明確的類(lèi)型鍵值數(shù)據(jù)庫(kù)的值沒(méi)有固定的形態(tài),它通常由一系列的字節(jié)所構(gòu)成。值的類(lèi)型可以是整數(shù)、浮點(diǎn)數(shù)、字符申、二進(jìn)制大型對(duì)象(BLOB),也可以是諸如JSON對(duì)象等半結(jié)構(gòu)化的構(gòu)件,還可以是圖像、聲音以及其他能夠用一系列字節(jié)來(lái)表示的任意類(lèi)型。比方說(shuō),可以把下面這個(gè)字符串與表示某顧客住址的鍵關(guān)聯(lián)起來(lái): '1232NERiverAve,St.Louis,MO'也可以不用字符串,而是采用列表的形式來(lái)存放住址信息: ('1232NERiverAve,St.Louis,MO')3.1.4值:存放任意數(shù)據(jù)另外,還可以用更有條理的JSON格式來(lái)存放此信息:{'Street:’:'1232NERiverAve','City':'St.Louis',:'State':'MO'}鍵值數(shù)據(jù)庫(kù)對(duì)其中存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)基本不會(huì)做出限定。大多數(shù)鍵值數(shù)據(jù)庫(kù)都會(huì)對(duì)值的大小做出限定。例如,Redis數(shù)據(jù)庫(kù)支持長(zhǎng)度為512MB的字符串值。以支持ACID事務(wù)著稱(chēng)的FoundationDB數(shù)據(jù)庫(kù),其值的大小不能超過(guò)100000B。3.1.4值:存放任意數(shù)據(jù)不同的鍵值數(shù)據(jù)庫(kù)也為值提供了不同的操作。所有的鍵值數(shù)據(jù)庫(kù)都支持對(duì)值進(jìn)行讀取及寫(xiě)入操作。有的鍵值數(shù)據(jù)庫(kù)還支持其他一些操作,如把字符串追加到已有的某個(gè)值尾部,或是訪(fǎng)問(wèn)字符串中的任意一部分內(nèi)容。這樣做可以提高效率。Radis數(shù)據(jù)庫(kù)支持另一種擴(kuò)充功能,它可以根據(jù)值來(lái)制定全文索引,使開(kāi)發(fā)者能夠利用API通過(guò)查詢(xún)語(yǔ)句來(lái)搜尋鍵和值。在選擇數(shù)據(jù)庫(kù)的過(guò)程中,應(yīng)該把應(yīng)用程序的需求考慮進(jìn)來(lái),在多項(xiàng)特性之間做出權(quán)衡。某個(gè)鍵值數(shù)據(jù)庫(kù)也許會(huì)支持ACID事務(wù),但是卻只
允許使用較小的鍵與值。另一個(gè)鍵值數(shù)據(jù)庫(kù)也許能夠存
放較大的值,但卻規(guī)定只能用數(shù)字或字符串做鍵。3.1.4值:存放任意數(shù)據(jù)2.對(duì)值進(jìn)行搜索時(shí)的―些限制鍵值數(shù)據(jù)庫(kù)對(duì)值的各種操作都是根據(jù)鍵來(lái)執(zhí)行的??梢愿鶕?jù)鍵來(lái)獲取相關(guān)的值,根據(jù)鍵來(lái)設(shè)置相關(guān)的值,或是根據(jù)鍵來(lái)刪除相關(guān)的值。如果還要執(zhí)行其他操作,如搜尋城市為“St.Louis”的地址信息,那就需要開(kāi)發(fā)者在應(yīng)用程序里面自己去實(shí)現(xiàn)了。鍵值數(shù)據(jù)庫(kù)并不支持用查詢(xún)語(yǔ)言對(duì)值進(jìn)行搜索。3.1.4值:存放任意數(shù)據(jù)3.1.5
鍵值數(shù)據(jù)庫(kù)的數(shù)據(jù)建模NoSQL數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)化程度不高,不同的開(kāi)發(fā)商及開(kāi)源項(xiàng)目可能會(huì)在各自的NoSQL數(shù)據(jù)庫(kù)中使用一些特有的專(zhuān)門(mén)詞匯或數(shù)據(jù)結(jié)構(gòu)。BigdatastorageandmanagementNoSQL數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)化程度不高,不同的開(kāi)發(fā)商及開(kāi)源項(xiàng)目可能會(huì)在各自的NoSQL數(shù)據(jù)庫(kù)中使用一些特有的專(zhuān)門(mén)詞匯或數(shù)據(jù)結(jié)構(gòu)。3.1.5鍵值數(shù)據(jù)庫(kù)的數(shù)據(jù)建模1.數(shù)據(jù)模型和數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)庫(kù)中的數(shù)據(jù)能夠傳達(dá)信息,而數(shù)據(jù)模型就是用來(lái)排列這些信息的一種抽象方式,它們與數(shù)據(jù)結(jié)構(gòu)有所區(qū)別。數(shù)據(jù)結(jié)構(gòu)是一種有明確定義的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),它一般要通過(guò)底層硬件中的某些元件來(lái)實(shí)現(xiàn),這些元件通常是指隨機(jī)存取存儲(chǔ)器(RAM)或硬盤(pán)及閃存盤(pán)等持久化數(shù)據(jù)存儲(chǔ)介質(zhì)。例如,編程語(yǔ)言中的整數(shù)型變量可能會(huì)用4個(gè)連續(xù)的字節(jié),也就是32個(gè)二進(jìn)制位來(lái)實(shí)現(xiàn)。含有100個(gè)整數(shù)的數(shù)組可以連續(xù)地存放在內(nèi)存之中,數(shù)組里的每個(gè)元素都用4個(gè)字節(jié)來(lái)表示。數(shù)據(jù)結(jié)構(gòu)都擁有一套處理本結(jié)構(gòu)所用的操作。例如整數(shù)數(shù)據(jù)結(jié)構(gòu)定義了加、減、乘、除等操作,而數(shù)組則提供了以下標(biāo)為依據(jù)的讀取操作和寫(xiě)入操作。數(shù)據(jù)結(jié)構(gòu)提供了一種宏觀(guān)的排列方式,使得開(kāi)發(fā)者既不用去關(guān)注底層的內(nèi)存地址,又無(wú)需通過(guò)這些地址在硬件層面上進(jìn)行操作。3.1.5鍵值數(shù)據(jù)庫(kù)的數(shù)據(jù)建模數(shù)據(jù)模型也是用類(lèi)似的方法進(jìn)行抽象的,它是搭建在數(shù)據(jù)結(jié)構(gòu)之上的一種排列和抽象方式。數(shù)據(jù)模型一般用來(lái)安排多種相關(guān)的信息。對(duì)于管理客戶(hù)信息所用的數(shù)據(jù)模型來(lái)說(shuō),它可能會(huì)針對(duì)客戶(hù)的姓名、住址、訂單及支付記錄進(jìn)行建模。而對(duì)于臨床數(shù)據(jù)庫(kù)來(lái)說(shuō),則可能包含病人姓名、年齡、性別、
當(dāng)前的處方、過(guò)去做過(guò)的手術(shù)、過(guò)敏情況以及其
他一些與醫(yī)療有關(guān)的細(xì)節(jié)。實(shí)際上記錄這些數(shù)據(jù)
更有效、更迅速的辦法應(yīng)該是用數(shù)據(jù)模型與數(shù)據(jù)
庫(kù)來(lái)做。圖3-4數(shù)據(jù)模型是搭建在數(shù)據(jù)結(jié)構(gòu)上方的一種抽象層3.1.5鍵值數(shù)據(jù)庫(kù)的數(shù)據(jù)建模數(shù)據(jù)模型中的元件會(huì)隨著數(shù)據(jù)庫(kù)的類(lèi)型不同而有所不同。關(guān)系型數(shù)據(jù)庫(kù)是圍繞著表格來(lái)構(gòu)建的。表格用來(lái)存儲(chǔ)與實(shí)體有關(guān)的信息,實(shí)體可以代表顧客、病人、訂單或手術(shù)等事物。實(shí)體的屬性用來(lái)記錄特定實(shí)體的具體信息。屬性可以是名稱(chēng)、年齡、配送地址等。在關(guān)系型數(shù)據(jù)庫(kù)中,表格是由很多列構(gòu)成的,每一列都對(duì)應(yīng)于一項(xiàng)屬性。表格內(nèi)的每行則對(duì)應(yīng)于實(shí)體的每個(gè)實(shí)例,如某位具體的顧客或病人。軟件工程師在設(shè)計(jì)數(shù)據(jù)庫(kù)的時(shí)候,會(huì)選擇一些數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)數(shù)據(jù)模型中的表格及其他元件,這就減輕了應(yīng)用程序開(kāi)發(fā)者的工作量,使得他們不用再處理那些細(xì)節(jié)問(wèn)題。在關(guān)系型數(shù)據(jù)模型的設(shè)計(jì)中,邏輯數(shù)據(jù)模型與物理數(shù)據(jù)模型是有區(qū)別的。實(shí)體和屬性是邏輯數(shù)據(jù)模型使用的術(shù)語(yǔ),二者分別對(duì)應(yīng)于物理數(shù)據(jù)模型中的表格和列。3.1.5鍵值數(shù)據(jù)庫(kù)的數(shù)據(jù)建模2.命名空間命名空間是由鍵值對(duì)所構(gòu)成的集合,可以把它想象成由互不重復(fù)的鍵值對(duì)所組成的一個(gè)集、一個(gè)集合或一個(gè)列表,或者它好似一個(gè)存放鍵值對(duì)的桶(bucket)。一個(gè)命名空間本身就可以構(gòu)成一個(gè)完整的鍵值數(shù)據(jù)庫(kù),它是由鍵值對(duì)所構(gòu)成的集合,而這些鍵值對(duì)中的鍵名彼此都不會(huì)重復(fù),而鍵值對(duì)的值是可以相互重復(fù)的。如果多個(gè)程序都使用同一份鍵值數(shù)據(jù)庫(kù),那么命名空間就很有用了,因?yàn)槟切┏绦虻拈_(kāi)發(fā)者只要不打算在程序間共享數(shù)據(jù),就無(wú)需擔(dān)心自己所用的鍵名構(gòu)造方式會(huì)和其他程序所用的命名方式相沖突,因?yàn)槊臻g會(huì)給值加上一個(gè)默認(rèn)的前綴。顧客管理團(tuán)隊(duì)可以創(chuàng)建名為custMgmt的命名空間,而訂單管理團(tuán)隊(duì)則可以創(chuàng)建名為ordMgnt的命名空間。這樣一來(lái)他們就可以把各自用到的鍵和值,都保存在自己的命名空間里面。3.1.5鍵值數(shù)據(jù)庫(kù)的數(shù)據(jù)建模3.分區(qū)與分區(qū)鍵把數(shù)據(jù)分割成多個(gè)命名空間是一種非常有用的規(guī)劃方式,與之類(lèi)似,也可以把集群劃分成多個(gè)小單元(稱(chēng)為分區(qū))。集群中的每個(gè)分區(qū)都是一組服務(wù)器,或是運(yùn)行在服務(wù)器上的一組鍵值數(shù)據(jù)庫(kù)軟件實(shí)例,而數(shù)據(jù)庫(kù)中的數(shù)據(jù)子集則會(huì)分別交由這些分區(qū)來(lái)進(jìn)行處理。所選的分區(qū)方案應(yīng)該要能盡量把負(fù)載平均分配到集群中的每一臺(tái)服務(wù)器。同一臺(tái)服務(wù)器中也可能會(huì)出現(xiàn)多個(gè)分區(qū)。如果服務(wù)器上
面運(yùn)行著虛擬機(jī),而每一臺(tái)虛擬機(jī)都各自形成一個(gè)分區(qū)
的話(huà),那就會(huì)出現(xiàn)這種情況。此外,鍵值數(shù)據(jù)庫(kù)本身也
可以在一臺(tái)服務(wù)器上面運(yùn)行分區(qū)軟件的多個(gè)實(shí)例。3.1.5鍵值數(shù)據(jù)庫(kù)的數(shù)據(jù)建模分區(qū)鍵就是決定數(shù)據(jù)值應(yīng)該保存到哪個(gè)分區(qū)所用的鍵。對(duì)于鍵值數(shù)據(jù)庫(kù)來(lái)說(shuō),每個(gè)鍵都會(huì)用來(lái)決定與之相關(guān)的值應(yīng)該存放在何處。例如,文檔數(shù)據(jù)庫(kù)只會(huì)把文檔中的某一個(gè)屬性當(dāng)成分區(qū)鍵。某些情況下,僅依靠鍵本身,可能無(wú)法實(shí)現(xiàn)負(fù)載均衡。此時(shí),應(yīng)該使用哈希函數(shù)。哈希函數(shù)可以把輸入的字符串映射成定長(zhǎng)的字符串,對(duì)于不同的輸入字符串來(lái)說(shuō),映射出的字符串通常也不會(huì)互相重復(fù)。可以將哈希函數(shù)理解為一種映射方式,它能夠把一套分布不均勻的鍵名映射成另外一套分布較為均
衡的鍵名。3.1.5鍵值數(shù)據(jù)庫(kù)的數(shù)據(jù)建模4.無(wú)模式的模型無(wú)模式這個(gè)詞用來(lái)形容數(shù)據(jù)庫(kù)的邏輯模型。使用鍵值數(shù)據(jù)庫(kù)的時(shí)候,不需要在添加數(shù)據(jù)之前率先定義好所有的鍵,也不需要指定值的類(lèi)型。例如,可以用下面這樣的鍵來(lái)直接存儲(chǔ)顧客的全名: cust:8983:fullName='JaneAnderson'假設(shè)后來(lái)覺(jué)得不應(yīng)該把顧客的全名都保存在一個(gè)值里,而是應(yīng)該把名字和姓氏分開(kāi)保存,那么,只需要修改保存相關(guān)鍵值的所用語(yǔ)句就可
以了:cust:8983:firstName='Jane'cust:8983:lastName='Anderson'3.1.5鍵值數(shù)據(jù)庫(kù)的數(shù)據(jù)建模把顧客全名保存在一個(gè)字符串里的那些鍵值對(duì),與將名字和姓氏分開(kāi)保存的那些鍵值對(duì)是可以共存的,它們之間不會(huì)出現(xiàn)問(wèn)題。修改了姓名的存儲(chǔ)方式之后,開(kāi)發(fā)者當(dāng)然還需要修改程序的代碼,使得程序能夠同時(shí)處理這兩種表現(xiàn)形式,或者使程序能夠把其中一種形式全都轉(zhuǎn)換成另外一種形式。3.1.5鍵值數(shù)據(jù)庫(kù)的數(shù)據(jù)建模3.1.6
鍵值數(shù)據(jù)庫(kù)的架構(gòu)鍵值數(shù)據(jù)庫(kù)的架構(gòu)是指與服務(wù)器、網(wǎng)絡(luò)組件及協(xié)調(diào)多臺(tái)服務(wù)器之間工作的相關(guān)軟件有關(guān)的一系列特征。Bigdatastorageandmanagement鍵值數(shù)據(jù)庫(kù)的架構(gòu)是指與服務(wù)器、網(wǎng)絡(luò)組件及協(xié)調(diào)多臺(tái)服務(wù)器之間工作的相關(guān)軟件有關(guān)的一系列特征。鍵值數(shù)據(jù)庫(kù)用自己的一套術(shù)語(yǔ)來(lái)描述數(shù)據(jù)模型、架構(gòu)以及實(shí)現(xiàn)層面的組件。鍵、值、分區(qū)及分區(qū)鍵是與數(shù)據(jù)模型有關(guān)的重要概念,而集群、環(huán)以及復(fù)制是涉及架構(gòu)的重要話(huà)題。3.1.6鍵值數(shù)據(jù)庫(kù)的架構(gòu)1.集群集群(cluster)是一系列相互連接的計(jì)算機(jī),這些計(jì)算機(jī)彼此之問(wèn)可以相互配合,以處理相關(guān)的操作。集群可以是松散耦合的,也可以是緊密耦合的。在松散耦合的集群中,各臺(tái)服務(wù)器相對(duì)獨(dú)立,它們只需要在集群內(nèi)進(jìn)行少量的通信就可以各自完成很多任務(wù)。而在緊密耦合的集群中,服務(wù)器之間會(huì)頻繁地進(jìn)行通信,以便完成一些需要緊密協(xié)作才可以實(shí)現(xiàn)的操作或計(jì)算。鍵值數(shù)據(jù)庫(kù)集群一般是松散耦合的。3.1.6鍵值數(shù)據(jù)庫(kù)的架構(gòu)在松散耦合的集群中,每臺(tái)服務(wù)器(也稱(chēng)為節(jié)點(diǎn))可以把自己所要處理的數(shù)據(jù)范圍分享給其他服務(wù)器,也可以定期給其他服務(wù)器發(fā)送消息以判斷那些服務(wù)器是否還在正常運(yùn)作。這種互相傳送消息的做法可以檢測(cè)出發(fā)生故障的服務(wù)器節(jié)點(diǎn)。當(dāng)某個(gè)節(jié)點(diǎn)出現(xiàn)故障時(shí),其他節(jié)點(diǎn)可以把那個(gè)節(jié)點(diǎn)的工作量承攬過(guò)來(lái),以便響應(yīng)用戶(hù)的請(qǐng)求。某些集群會(huì)設(shè)立一個(gè)主節(jié)點(diǎn)。比方說(shuō),Redis數(shù)據(jù)庫(kù)的主節(jié)點(diǎn)會(huì)負(fù)責(zé)執(zhí)行讀取操作及寫(xiě)入操作,也會(huì)負(fù)責(zé)把數(shù)據(jù)副本復(fù)制到各個(gè)從節(jié)點(diǎn)之中。從節(jié)點(diǎn)只受理讀取請(qǐng)求。如果主節(jié)點(diǎn)發(fā)生故障,那么集群中的其他節(jié)點(diǎn)會(huì)選出新的主節(jié)點(diǎn)。若從節(jié)點(diǎn)發(fā)生故障,則集群中的其他節(jié)點(diǎn)仍然照常受理讀取請(qǐng)求。還有一些集群是無(wú)主式的。例如Riak數(shù)據(jù)庫(kù)的所有節(jié)點(diǎn)就都可以支持讀取操作及寫(xiě)入操作。如果其中某個(gè)節(jié)點(diǎn)出現(xiàn)故障,那么其他節(jié)點(diǎn)會(huì)分擔(dān)那個(gè)節(jié)點(diǎn)所需處理的讀取和寫(xiě)入請(qǐng)求。3.1.6鍵值數(shù)據(jù)庫(kù)的架構(gòu)2.環(huán)無(wú)主式集群中的每個(gè)節(jié)點(diǎn)都負(fù)責(zé)管理某一組分區(qū)。有一種安排分區(qū)的方式叫做環(huán)狀結(jié)構(gòu)。環(huán)(ring)是一種排布分區(qū)所用的邏輯結(jié)構(gòu)。在環(huán)狀結(jié)構(gòu)中,每一臺(tái)服務(wù)器或運(yùn)行在服務(wù)器上的每一個(gè)鍵值數(shù)據(jù)庫(kù)軟件實(shí)例,都會(huì)與相鄰的兩臺(tái)服務(wù)器或?qū)嵗噫溄右詷?gòu)成環(huán)形。每臺(tái)服務(wù)器或?qū)嵗?fù)責(zé)處理某一部分?jǐn)?shù)據(jù),至于具體該處理哪一部分?jǐn)?shù)據(jù)則是根據(jù)分區(qū)鍵來(lái)劃分的。3.1.6鍵值數(shù)據(jù)庫(kù)的架構(gòu)假設(shè)有個(gè)簡(jiǎn)單的哈希式函數(shù)可以把字符串映射為分區(qū)鍵,也就是能夠把‘cust:8983:firstName’這樣的字符串映射為0~95之間的值。那么,可以考慮用哈希式函數(shù)所返回的96種值來(lái)確定分區(qū),并把分區(qū)分別與各臺(tái)服務(wù)器相關(guān)聯(lián)。環(huán)狀結(jié)構(gòu)有助于簡(jiǎn)化一些原本較為復(fù)雜的操作。例如,當(dāng)系統(tǒng)把某項(xiàng)數(shù)據(jù)寫(xiě)入一臺(tái)服務(wù)器之后,它可以再將此數(shù)據(jù)寫(xiě)入與該服務(wù)器相連的另外兩臺(tái)服務(wù)器,使得鍵值數(shù)據(jù)庫(kù)的可用性得以提升。3.1.6鍵值數(shù)據(jù)庫(kù)的架構(gòu)3.復(fù)制復(fù)制是一個(gè)向集群中存儲(chǔ)多份副本的過(guò)程,數(shù)據(jù)庫(kù)系統(tǒng)可以通過(guò)復(fù)制來(lái)提升可用性。在復(fù)制過(guò)程中,需要考慮的一個(gè)因素是副本的數(shù)量。副本越多,損失數(shù)據(jù)的可能性就越小,但副本若是過(guò)多,性能則有可能下降。如果很容易就能重新
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川省瀘州市瀘州高級(jí)中學(xué)校2024-2025學(xué)年七年級(jí)上學(xué)期1月期末歷史試卷(含答案)
- 湖北省部分重點(diǎn)中學(xué)2024-2025學(xué)年高三上學(xué)期第二次聯(lián)考(期末)地理試卷(含答案)
- 睡眠醫(yī)學(xué)中心:精準(zhǔn)醫(yī)療引領(lǐng)健康睡眠未來(lái)趨勢(shì) 頭豹詞條報(bào)告系列
- 2025年度不動(dòng)產(chǎn)房產(chǎn)證購(gòu)房合同附帶車(chē)位使用權(quán)轉(zhuǎn)讓協(xié)議3篇
- 2024版多功能辦公設(shè)備采購(gòu)合同6篇
- 2024荒田承包合同范本
- 福建省南平市建陽(yáng)縣徐市中學(xué)高二數(shù)學(xué)理上學(xué)期期末試卷含解析
- 2025年EPS節(jié)能建筑項(xiàng)目施工安全管理合同3篇
- 2024薪資協(xié)議書(shū)-文化創(chuàng)意產(chǎn)業(yè)創(chuàng)作者模板2篇
- 2024版幕墻施工合同范文
- 人教版新教材高中生物選擇性必修一全冊(cè)重點(diǎn)知識(shí)點(diǎn)歸納總結(jié)(穩(wěn)態(tài)與調(diào)節(jié))
- 虹膜睫狀體炎實(shí)用全套PPT
- 事業(yè)單位公開(kāi)招聘面試考官測(cè)試題及答案
- 質(zhì)量員培訓(xùn)講座課件
- 廠(chǎng)區(qū)綠化養(yǎng)護(hù)及方案
- 旅游者對(duì)鼓浪嶼旅游產(chǎn)品的滿(mǎn)意度調(diào)查問(wèn)卷
- (完整word版)人員密集場(chǎng)所消防安全管理GA654-2006
- 初二(6)班-家長(zhǎng)會(huì)
- 光伏發(fā)電項(xiàng)目并網(wǎng)調(diào)試方案
- 高中化學(xué)競(jìng)賽題--成鍵理論
- 康復(fù)中心組織結(jié)構(gòu)圖
評(píng)論
0/150
提交評(píng)論