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