1.1 Nosql入門和概述
1.1.1 為什麼要使用Nosql?
首先在SQL下當今最流行的Mysql也會有出現瓶頸的時候。一個網站的訪問量一般都不大,而且更多的是靜態頁面,動態互動型別的網站不多,用單個資料庫完全可以輕鬆應對。但是資料量的總大小一個機器放不下時,資料的索引(B+Tree)一個機器的記憶體放不下時,訪問量(讀寫混合)一個例項不能承時,這時候我們們的Mysql就開始顯得乏力了。
隨著訪問量的上升,幾乎發部分使用MySQL架構的網站在資料庫上都開始出現效能問題,web程式不再僅僅專注在功能上,同時也在追求效能。程式設計師們開始大量的使用快取技術來緩解資料庫的壓力,優化資料庫的結構和索引。開始比較流行的是通過檔案快取來緩解資料庫壓力,但是訪問量繼續增大的時候,多臺web機器通過檔案快取不能共享,大量的小檔案快取也帶來了比較高的IO壓力。因此,Memcached就成為了一個非常時尚的技術產品。由於資料庫的寫入壓力增加,Memcached只能緩解資料庫的讀取壓力。讀寫集中在一個資料庫上讓資料庫不堪重負,大部分網站開始使用主從複製技術來達到讀寫分離,以提高讀寫效能和讀庫的可擴充套件性。Mysql的master-slave模式成為這個時候的網站標配。
在Memcached的快取記憶體,MySQL的主從複製,讀寫分離的基礎之上,這是MySQL的主庫的寫壓力開始出現瓶頸,而資料量的持續猛增,由於MyISAM使用表鎖,在高併發下會出現嚴重的鎖問題,大量的高併發MySQL應用開始使用InnoDB引擎代替MyISQM。同時開始流行使用分表分庫來緩解寫壓力和資料增長的擴充套件問題。這個時候,分表分庫成了一個熱門技術,是面試的熱門問題也是業界討論的熱門技術問題。也就是在這個時候,MySQL推出了還不太穩定的表分割槽,雖然MySQL推出了MySQL Cluster叢集,但效能也不能很好滿足網際網路的要求,只能在高可靠性上提供了非常大的保證。
MySQL資料庫也經常儲存一些大文字欄位,導致資料庫表非常的大,在做資料庫恢復的時候就導致非常的慢,不容易快速回複資料庫。比如1000萬4KB大小的文字就接近40GB的大小,如果能把這些資料從MySQL省去,MySQL將變得非常的小。關聯式資料庫很強大,但是它並不能很好的應付所有的應用場景。MySQL的擴充套件性差(需要複雜的技術來實現),大資料下IO壓力大,表結構更改困難,正式當前使用MySQL的開發人員面臨的問題。
今天我們可以通過第三方平臺(如Google,Facebook等)可以很容易的訪問和抓取資料。使用者個人資訊,社交網路,地理位置,使用者產生的資料和使用者操作日誌已經成倍的增加。我們如果要對這些使用者資料進行挖掘,那SQL資料庫已經不適合這些應用了,NoSQL資料庫的發展卻能很好的處理這些大的資料。
1.1.2 Nosql是什麼?
NoSQL(NoSQL = Not Only SQL),意思是不僅僅是SQL,泛指非關係型的資料庫。
隨著網際網路web2.0網站的興起,傳統的關聯式資料庫在應付web2.0網站,特別是超大規模和高併發的SNS型別的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關係型的資料庫則由於其本身的特點得到了非常迅速的發展。NoSQL資料庫的產生就是為了解決大規模資料集合多重資料種類帶來的挑戰,尤其是大資料應用難題,包含超大規模資料的儲存。
(例如古河或Facebook每天為他們的使用者手機萬億位元的資料)。這些型別的資料儲存不需要固定的模式,無需多餘操作就可以橫向擴充套件。
當前主流的幾類Nosql:
- Redis
- Memcache
- Mongdb
1.1.3 特點
- 易擴充套件性: NoSQL資料庫種類繁多,但是一個共同的特點都是去掉關聯式資料庫的關係型特性,資料之間無關係,這樣就非常容易擴充套件。也無形之間,在架構的層面上帶來了可擴充套件的能力。
- 大資料量高效能: NoSQL資料裡都具有非常高的讀寫效能,尤其在大資料量下,同樣表現優秀。這得益於它的無關係性,資料庫的結構簡單。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一種大粒度的Cache,在針對web2.0的互動頻繁的應用,Cache效能不高。而NoSQL的Cache是記錄級的,是一種細粒度的Cache,所以NoSQL在這個層面上來說就要效能高很多了。
- 多樣靈活的資料模型: NoSQL無需事先為要儲存的資料建立欄位,隨時可以儲存自定義的資料格式。而在關聯式資料庫裡,增刪欄位是一件非常麻煩的事情。如果是非常大資料量的表,增加欄位簡直就是一個噩夢。
1.2 安裝與使用(Redis)
redis安裝官網:https://redis.io/
基本上照著官網說得來沒什麼問題,我這裡說下我自己安裝過程中遇到的幾個問題(Liunx下,一般建議在Liunx下學習使用Redis):
1.自己之前購買的一臺Vultr伺服器,Debian9x+。有些廠商不會給你安裝好很好的開發環境,我這臺就是。在MAKE連結庫的時候沒有GCC命令導致編譯庫失敗,這裡手動安裝了一下GCC apt-get install GCC.重新編譯的時候注意,將剛才MAKE的檔案重新刪除再重新MAKE。
2.防火牆問題,有些機器廠商是有設定防火牆規則的,這裡可能需要手動去開啟下6379埠,具體操作自行百度:
記幾個命令:Select命令切換資料庫,Dbsize檢視當前資料庫的key的數量,Flushdb:清空當前庫,Flushall:通殺全部庫。
1.2.1 關於單程式
Redis的單程式模式:
單程式模型來處理客戶端的請求。對讀寫等時間的響應是通過對epoll函式的包裝來做到的。Redis的實際處理速度完全依靠主程式的執行效率。Epoll是Linux核心為處理大批量檔案描述符而作了改進的epoll,是Linux下多路複用IO介面select/poll的增強版本,它能顯著提高程式在大量併發連線中只有少量活躍情況下的系統CPU利用率。
1.2.2 Redis的五大資料型別
- String:
- string是redis最基本的型別,可以理解為Memcached一樣的型別,一個key對應一個value。
- string型別是二進位制安全的,意思是redis的string可以包含任何資料。比如ipg圖片或者序列化的物件。
- string型別是Redis最基本的資料結構,一個redis中字串value最多可以是512M。
- Hash(雜湊,類似java裡的Map):
- Redis hash是一個鍵值對集合。
- Redis hash是一個string型別的field和value的對映表,hash特別適合用於儲存物件。
- 類似java裡面的Map<String,Object>
- List(列表):
- Redis列表是簡單的字串列表,按照插入順序排序。可以新增一個元素到列表的頭部(左邊)或者尾部(右邊)。
- 它的底層是一個連結串列。
- Set(集合):
- Redis的Set是string型別的無序集合。它是通過HashTable實現的。
- Zset(sorted set:有序集合):
- Redis zset和set一樣也是string型別元素的集合,且不允許重複的成員。
- 不同的是每個元素都會關聯一個double型別的分數。
- redis正是通過分數來為集合中的成員進行從小到大排序。zset的成員是唯一的,但分數(score)卻可以重複。
1.2.3 常用命令使用
一般這塊都是些記憶內容,簡單記錄一下,相關使用文件可去官網檢視:http://redisdoc.com/
1.Redis鍵(key):
2. Redis字串(String):
3. Redis列表(List):
4. Redis集合(Set):
5. Redis雜湊(Hash):
6. Redis有序集合Zset(sorted set):