redis系列文章:
https://liudongdong.top/categories/redis
本篇來源:
https://liudongdong.top/archives/redisyi-nosql-yan-jin-shi
公眾號(hào):雨中散步撒哈拉
備注:歡迎公眾號(hào),一起學(xué)習(xí)秤茅,共同進(jìn)步!
一臼闻、數(shù)據(jù)庫演進(jìn)史
1. 單機(jī) MySQL 時(shí)代
在 web 初現(xiàn)崢嶸的那段時(shí)間 勺三,大部分網(wǎng)站都是使用的單機(jī) MySQL 來存儲(chǔ)用戶數(shù)據(jù)愕鼓,由于網(wǎng)站的用戶與訪問量不會(huì)太大顶别,甚至大部分都使用額靜態(tài)網(wǎng)頁,與后端沒有過多的交互拒啰,所以單機(jī) MySQL 足矣
但是隨著 web 的發(fā)展帶來的用戶群體激增,瓶頸也就隨之而來了完慧,在單機(jī) MySQL 時(shí)代谋旦,造成瓶頸的原因主要有
- 數(shù)據(jù)量太大,一個(gè)服務(wù)器硬盤存不下
- 讀寫混合屈尼,一個(gè)服務(wù)器性能不足
- 數(shù)據(jù)庫索引太大册着,內(nèi)存不足
2. 垂直拆分與緩存時(shí)代
后來,隨著網(wǎng)站訪問量的上升脾歧,使用單機(jī) MySQL 的網(wǎng)站開始出現(xiàn)了性能問題甲捏,因此程序員們將目光從功能轉(zhuǎn)移到了性能上
為了解決單機(jī) MySQL 時(shí)代的不足,又對(duì) MySQL 引入了 Memcached ( 緩存 ) 和垂直拆分 (讀寫分離)
等方案
一個(gè)運(yùn)行中的網(wǎng)站其大部分時(shí)間都是在被用戶進(jìn)行查詢操作鞭执,如果將讀寫拆分到不同的數(shù)據(jù)庫中司顿,就可以提高查詢效率,所以數(shù)據(jù)庫有了垂直拆分的方案兄纺,也就是數(shù)據(jù)庫根據(jù)作用拆分為讀服務(wù)器和寫服務(wù)器大溜,并利用主從復(fù)制保證數(shù)據(jù)正確,同時(shí)利用緩存加快速度
3. 水平拆分與集群時(shí)代
讀寫分離與分庫分表也滿足不了用戶數(shù)據(jù)的存儲(chǔ)了估脆,這時(shí)就出現(xiàn)了對(duì)服務(wù)器的水平拆分钦奋,多個(gè)主從節(jié)點(diǎn)組成一個(gè)集群節(jié)點(diǎn),而多個(gè)集群節(jié)點(diǎn)就組成了集群
4. 數(shù)據(jù)爆炸時(shí)代
在如今這個(gè)信息爆炸的時(shí)代,人們對(duì)于信息的實(shí)時(shí)性要求越來越高付材,互聯(lián)網(wǎng)用戶同樣也越來越多朦拖,因此 MySQL 等關(guān)系型數(shù)據(jù)庫就不夠用了,因?yàn)閿?shù)據(jù)量很大厌衔,數(shù)據(jù)變化也很快
通過對(duì)第三方平臺(tái)的訪問和數(shù)據(jù)抓取璧帝,可以很容易的獲得用戶個(gè)人信息,社交網(wǎng)絡(luò)葵诈,用戶生成的數(shù)據(jù)和用戶的操作日志已經(jīng)成倍的增加裸弦,對(duì)于這些結(jié)構(gòu)并不確定的數(shù)據(jù)如果想要對(duì)這些數(shù)據(jù)進(jìn)行深度的挖掘,那關(guān)系型數(shù)據(jù)庫就已經(jīng)不再實(shí)用了
二作喘、什么是 NoSQL
NoSQL = Not Only SQL理疙,即泛指非關(guān)系型數(shù)據(jù)庫
由于 web2.0 時(shí)代的到來,互聯(lián)網(wǎng)用戶和數(shù)據(jù)量呈幾何式上升泞坦,傳統(tǒng)的非關(guān)系型數(shù)據(jù)庫很難應(yīng)付大型網(wǎng)站的超大數(shù)據(jù)量和高并發(fā)窖贤,這就暴露出來了很多關(guān)系型數(shù)據(jù)庫難以克服的問題
因?yàn)殛P(guān)系型數(shù)據(jù)庫從本質(zhì)上來說就是一張表格,是有固定結(jié)構(gòu)的贰锁,并且所有的數(shù)據(jù)都必須遵循相同的方式進(jìn)行存儲(chǔ)
而非關(guān)系型數(shù)據(jù)庫是非結(jié)構(gòu)化的赃梧,數(shù)據(jù)可以以多種方式存儲(chǔ),即可以面向文檔存儲(chǔ)豌熄,面向圖像存儲(chǔ)授嘀,甚至面向 K-V 存儲(chǔ)等。Java 中的 Map<string, Object> 就是一種經(jīng)典的 "NoSQL"锣险,因?yàn)?Object 類型可以面向任何類型的對(duì)象
1. NoSQL 的特點(diǎn)
- 方便擴(kuò)展蹄皱,數(shù)據(jù)之間沒有關(guān)系
- 大數(shù)據(jù)量存儲(chǔ),高性能 ( redis 1s 能寫 8w 次芯肤,讀取 11w 條)
- 數(shù)據(jù)類型多樣巷折,不需要事先設(shè)計(jì)數(shù)據(jù)庫
2. RDBMS 和 NoSQL 的區(qū)別
RDBMS
- RDBMS 使用結(jié)構(gòu)化組織
- DDL,DQL崖咨,DML
- 數(shù)據(jù)和關(guān)系都存在單獨(dú)的表中锻拘,只能以行和列進(jìn)行存儲(chǔ)
- ACID 原則,嚴(yán)格一致性
- 事務(wù)
- ...
NoSQL
- 沒有固定的查詢語言
- 存儲(chǔ)方式多樣化:鍵值對(duì)存儲(chǔ) ( redis )击蹲,列存儲(chǔ) ( HBase )署拟,文檔存儲(chǔ) ( MongDB ),圖形數(shù)據(jù)庫
- 最終一致性际邻,只需保證數(shù)據(jù)的最終一致
- CAP 定理和 Base 理論 ( 異地多活 )
- 高性能芯丧,高可用,高可擴(kuò)
- ...
在公司中世曾,一定是 NoSQL + RDBMS 一起使用
3. 大數(shù)據(jù)時(shí)代的要求
大數(shù)據(jù)時(shí)代有 3V 和 3高的概念
3V 用來描述大數(shù)據(jù)時(shí)代下數(shù)據(jù)的問題:
- 海量 ( volume )
- 多樣 ( variety )
- 實(shí)時(shí) (velocity)
3高指的是大數(shù)據(jù)時(shí)代缨恒,程序所需要達(dá)到的標(biāo)準(zhǔn):
- 高可用
- 高并發(fā)
- 高性能
三谴咸、阿里巴巴架構(gòu)演進(jìn)
阿里從 2010 年底,開始實(shí)施第五代網(wǎng)站架構(gòu)改造骗露,阿里巴巴對(duì)第五代架構(gòu)有如下要求
- 敏捷:需求的敏捷開發(fā)岭佳,應(yīng)用系統(tǒng)的膨脹和耦合惡化使得架構(gòu)越來越復(fù)雜,該如何保持業(yè)務(wù)的敏捷開發(fā)
- 開放:如何提升網(wǎng)站開放性萧锉,吸引第三方開發(fā)者加入到網(wǎng)站的共建
- 體驗(yàn):并發(fā)壓力快速增長珊随,用戶對(duì)體驗(yàn)的要求也越來越高
1. 數(shù)據(jù)層:數(shù)據(jù)架構(gòu)的日益復(fù)雜
復(fù)雜的數(shù)據(jù)架構(gòu)圖
為了提高訪問速度,一個(gè)商品的不同信息就可能來自不同的數(shù)據(jù)庫
- 商品基本信息:名稱柿隙,商家信息等叶洞,可以存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中
- 商品的描述,評(píng)論:由于這部分的文字較多禀崖,因此存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中可能會(huì)導(dǎo)致性能下降衩辟,因此使用的是文檔型數(shù)據(jù)庫,如 MongDB
- 圖片:分布式文件系統(tǒng)波附。淘寶的 TFS艺晴,阿里云的 OSS,google 的 GFT掸屡,Hadoop 的 HDFS封寞,以及 FastDFS,
- 關(guān)鍵字搜索:solr仅财,elasticsearch狈究,淘寶使用的則是 Isearch
- 商品熱門的波段信息:內(nèi)存數(shù)據(jù)庫 redis,tair盏求,memache
- 商品的交易谦炒,外部支付接口:第三方應(yīng)用
數(shù)據(jù)的多樣性就帶來了很多的問題
- 數(shù)據(jù)源繁多,數(shù)據(jù)源改造導(dǎo)致相關(guān)應(yīng)用的大面積重構(gòu)
- 跨數(shù)據(jù)源定位問題困難风喇,緩存和性能優(yōu)化難以實(shí)施
- 數(shù)據(jù)架構(gòu)復(fù)雜,應(yīng)用需要直接依賴多種類型的數(shù)據(jù)源
- ...
為了解決這些問題缕探,阿里巴巴提出的解決訪問是:統(tǒng)一數(shù)據(jù)服務(wù)層 UDSL
魂莫,在網(wǎng)站應(yīng)用集群和底層數(shù)據(jù)源之間構(gòu)建一層代理,統(tǒng)一數(shù)據(jù)層
增加了 UDSL 后的數(shù)據(jù)架構(gòu)如下
UDSL 屏蔽了底層數(shù)據(jù)庫的差異爹耗,使用統(tǒng)一的操作語言對(duì)不同的數(shù)據(jù)庫進(jìn)行操作耙考,具體細(xì)節(jié)由 UDSL 進(jìn)行維護(hù)
2. 熱點(diǎn)緩存
使用了 UDSL 后,數(shù)據(jù)架構(gòu)雖然得到了大幅的簡化潭兽,但是性能問題依然很嚴(yán)重倦始。網(wǎng)站的數(shù)據(jù)非常龐大,緩存過多數(shù)據(jù)的性價(jià)比不高山卦,因此緩存熱點(diǎn)數(shù)據(jù)成了最好的選擇
因此阿里巴巴開發(fā)了熱點(diǎn)緩存平臺(tái)鞋邑,提供給 UDSL 作為緩存系統(tǒng)
四、NoSQL 四大類型
1. KV 鍵值對(duì)型
以鍵值對(duì)形式存儲(chǔ)數(shù)據(jù),常見的有 Redis枚碗,Tair逾一,Memecache
2. 文檔型
傳輸格式多為 Bson,和 Json 類似
常見的有 MongDB肮雨,MongDB 是基于分布式文件存儲(chǔ)的數(shù)據(jù)庫遵堵,使用 C++ 編寫,主要用來處理大量的文檔怨规,MongDB 是非關(guān)系型數(shù)據(jù)庫中功能最豐富陌宿,最像關(guān)系型數(shù)據(jù)庫的
此外還有:CouchDB,RavenDB ...... 等
3. 列存儲(chǔ)型
常見的有 HBase波丰,和一些分布式文件系統(tǒng)
4. 圖關(guān)系數(shù)據(jù)庫
圖關(guān)系數(shù)據(jù)庫并不是用來存儲(chǔ)圖片的壳坪,而是用來存儲(chǔ)關(guān)系和構(gòu)建關(guān)系圖譜的,比如:社交網(wǎng)絡(luò)呀舔,朋友圈弥虐,廣告推薦等
常見的有:Neo4j,InfoGrid ...... 等