更新時(shí)間:2019-01-10 來源:黑馬程序員 瀏覽量:
什么是NOSQL
NoSQL(NoSQL = Not Only SQL),意即“不僅僅是SQL”,是一項(xiàng)全新的數(shù)據(jù)庫理念,泛指非關(guān)系型的數(shù)據(jù)庫。
為什么需要NOSQL
隨著互聯(lián)網(wǎng)的高速崛起,網(wǎng)站的用戶群的增加,訪問量的上升,傳統(tǒng)數(shù)據(jù)庫上都開始出現(xiàn)了性能瓶頸,web程序不再僅僅專注在功能上,同時(shí)也在追求性能。所以NOSQL數(shù)據(jù)庫應(yīng)運(yùn)而上,具體表現(xiàn)為對(duì)如下三高問題的解決:
· High performance - 對(duì)數(shù)據(jù)庫高并發(fā)讀寫的需求
web2.0網(wǎng)站要根據(jù)用戶個(gè)性化信息來實(shí)時(shí)生成動(dòng)態(tài)頁面和提供動(dòng)態(tài)信息,所以基本上無法使用動(dòng)態(tài)頁面靜態(tài)化技術(shù),因此數(shù)據(jù)庫并發(fā)負(fù)載非常高,往往要達(dá)到每秒上萬次讀寫請(qǐng)求。關(guān)系數(shù)據(jù)庫應(yīng)付上萬次SQL查詢還勉強(qiáng)頂?shù)米。菓?yīng)付上萬次SQL寫數(shù)據(jù)請(qǐng)求,硬盤IO就已經(jīng)無法承受了。其實(shí)對(duì)于普通的BBS網(wǎng)站,往往也存在對(duì)高并發(fā)寫請(qǐng)求的需求,例如網(wǎng)站的實(shí)時(shí)統(tǒng)計(jì)在線用戶狀態(tài),記錄熱門帖子的點(diǎn)擊次數(shù),投票計(jì)數(shù)等,因此這是一個(gè)相當(dāng)普遍的需求。
· Huge Storage - 對(duì)海量數(shù)據(jù)的高效率存儲(chǔ)和訪問的需求
類似Facebook,twitter,F(xiàn)riendfeed這樣的SNS網(wǎng)站,每天用戶產(chǎn)生海量的用戶動(dòng)態(tài),以Friendfeed為例,一個(gè)月就達(dá)到了2.5億條用戶動(dòng)態(tài),對(duì)于關(guān)系數(shù)據(jù)庫來說,在一張2.5億條記錄的表里面進(jìn)行SQL查詢,效率是極其低下乃至不可忍受的。再例如大型web網(wǎng)站的用戶登錄系統(tǒng),例如騰訊,盛大,動(dòng)輒數(shù)以億計(jì)的帳號(hào),關(guān)系數(shù)據(jù)庫也很難應(yīng)付。
· High Scalability && HighAvailability- 對(duì)數(shù)據(jù)庫的高可擴(kuò)展性和高可用性的需求
在基于web的架構(gòu)當(dāng)中,數(shù)據(jù)庫是最難進(jìn)行橫向擴(kuò)展的,當(dāng)一個(gè)應(yīng)用系統(tǒng)的用戶量和訪問量與日俱增的時(shí)候,你的數(shù)據(jù)庫卻沒有辦法像web server和app server那樣簡(jiǎn)單的通過添加更多的硬件和服務(wù)節(jié)點(diǎn)來擴(kuò)展性能和負(fù)載能力。對(duì)于很多需要提供24小時(shí)不間斷服務(wù)的網(wǎng)站來說,對(duì)數(shù)據(jù)庫系統(tǒng)進(jìn)行升級(jí)和擴(kuò)展是非常痛苦的事情,往往需要停機(jī)維護(hù)和數(shù)據(jù)遷移。
什么是Redis
Redis是用C語言開發(fā)的一個(gè)開源的高性能鍵值對(duì)(key-value)數(shù)據(jù)庫,官方提供測(cè)試數(shù)據(jù),50個(gè)并發(fā)執(zhí)行100000個(gè)請(qǐng)求,讀的速度是110000次/s,寫的速度是81000次/s ,且Redis通過提供多種鍵值數(shù)據(jù)類型來適應(yīng)不同場(chǎng)景下的存儲(chǔ)需求,目前為止Redis支持的鍵值數(shù)據(jù)類型如下:
· 字符串類型 string(常用:json/xml)
· 散列類型 hash(key value key--value(map) )
· 列表類型 list linkedlist 用戶列表
· 集合類型 set
· 有序集合類型 sortedset
Redis的應(yīng)用場(chǎng)景
· 緩存(數(shù)據(jù)查詢、短連接、新聞內(nèi)容、商品內(nèi)容等等)
· 聊天室的在線好友列表
· 任務(wù)隊(duì)列(開發(fā)中常用ActiveMQ 或者 RabbitMQ)(秒殺、搶購(gòu)、12306等等)
· 應(yīng)用排行榜
· 網(wǎng)站訪問統(tǒng)計(jì)
· 數(shù)據(jù)過期處理(可以精確到毫秒)
· 分布式集群架構(gòu)中的session分離
字符串類型string
字符串類型是Redis中最為基礎(chǔ)的數(shù)據(jù)存儲(chǔ)類型,字符串在Redis中是二進(jìn)制保存,因此是安全的,這便意味著該類型存入和獲取的數(shù)據(jù)相同。
在Redis中字符串類型的Value最多可以容納的數(shù)據(jù)長(zhǎng)度是512M。
哈希類型hash
Redis中的Hash類型可以看成具有StringKey和String Value的map容器。
所以該類型非常適合于存儲(chǔ)值對(duì)象的信息。
如username、password和age等。
如果Hash中包含很少的字段,那么該類型的數(shù)據(jù)也將僅占用很少的磁盤空間。
每一個(gè)Hash可以存儲(chǔ)4294967295個(gè)鍵值對(duì)。
列表類型list
在Redis中,List類型是按照插入順序排序的字符串鏈表。和數(shù)據(jù)結(jié)構(gòu)中的普通鏈表一樣,我們可以在其頭部(left)和尾部(right)添加新的元素。
在插入時(shí),如果該鍵不存在,Redis將為該鍵創(chuàng)建一個(gè)新的鏈表。
如果鏈表中所有的元素均被移除,那么該鍵也將會(huì)被從數(shù)據(jù)庫中刪除。
List中可以包含的最大元素?cái)?shù)量是4294967295
集合類型set
在Redis中,我們可以將Set類型看作為沒有排序的字符集合,和List類型一樣,我們也可以在該類型的數(shù)據(jù)值上執(zhí)行添加、刪除或判斷某一元素是否存在等操作。需要說明的是,這些操作的時(shí)間復(fù)雜度為O(1),即常量時(shí)間內(nèi)完成次操作。Set可包含的最大元素?cái)?shù)量是4294967295,和List類型不同的是,Set集合中不允許出現(xiàn)重復(fù)的元素。
其他:
Redis5.0 新增 API Timesand cluster api RDB現(xiàn)在存儲(chǔ)LFU和LRU LFU --》叫做最近最少使用算法 LRU--->叫做最近最常使用算法
集群管理器從Ruby移植到C代碼 通過Redis腳本可以直接創(chuàng)建
新的sorted set命令 ZPOPMIN/MAX 和 阻塞變種 作用去除集合中分值最大和最小的值
主動(dòng)內(nèi)存碎片整理
增強(qiáng)HyperLogLog實(shí)現(xiàn) 通過算法估算內(nèi)存基數(shù)
更好的內(nèi)存統(tǒng)計(jì)報(bào)告
更好的幫助命令
客戶端經(jīng)常連接和斷開性能更好
錯(cuò)誤修復(fù)和改進(jìn)
jemjemalloc升級(jí)到5.1版本 內(nèi)存分配器