首頁技術文章正文

NOSQL---Redis

更新時間:2019-01-10 來源:黑馬程序員 瀏覽量:

  什么是NOSQL

  NoSQL(NoSQL = Not Only SQL),意即“不僅僅是SQL”,是一項全新的數據庫理念,泛指非關系型的數據庫。

  為什么需要NOSQL

  隨著互聯網的高速崛起,網站的用戶群的增加,訪問量的上升,傳統數據庫上都開始出現了性能瓶頸,web程序不再僅僅專注在功能上,同時也在追求性能。所以NOSQL數據庫應運而上,具體表現為對如下三高問題的解決:

  · High performance - 對數據庫高并發(fā)讀寫的需求

  web2.0網站要根據用戶個性化信息來實時生成動態(tài)頁面和提供動態(tài)信息,所以基本上無法使用動態(tài)頁面靜態(tài)化技術,因此數據庫并發(fā)負載非常高,往往要達到每秒上萬次讀寫請求。關系數據庫應付上萬次SQL查詢還勉強頂得住,但是應付上萬次SQL寫數據請求,硬盤IO就已經無法承受了。其實對于普通的BBS網站,往往也存在對高并發(fā)寫請求的需求,例如網站的實時統計在線用戶狀態(tài),記錄熱門帖子的點擊次數,投票計數等,因此這是一個相當普遍的需求。

  · Huge Storage - 對海量數據的高效率存儲和訪問的需求

  類似Facebook,twitter,Friendfeed這樣的SNS網站,每天用戶產生海量的用戶動態(tài),以Friendfeed為例,一個月就達到了2.5億條用戶動態(tài),對于關系數據庫來說,在一張2.5億條記錄的表里面進行SQL查詢,效率是極其低下乃至不可忍受的。再例如大型web網站的用戶登錄系統,例如騰訊,盛大,動輒數以億計的帳號,關系數據庫也很難應付。

  · High Scalability && HighAvailability- 對數據庫的高可擴展性和高可用性的需求

  在基于web的架構當中,數據庫是最難進行橫向擴展的,當一個應用系統的用戶量和訪問量與日俱增的時候,你的數據庫卻沒有辦法像web server和app server那樣簡單的通過添加更多的硬件和服務節(jié)點來擴展性能和負載能力。對于很多需要提供24小時不間斷服務的網站來說,對數據庫系統進行升級和擴展是非常痛苦的事情,往往需要停機維護和數據遷移。

  什么是Redis

  Redis是用C語言開發(fā)的一個開源的高性能鍵值對(key-value)數據庫,官方提供測試數據,50個并發(fā)執(zhí)行100000個請求,讀的速度是110000次/s,寫的速度是81000次/s ,且Redis通過提供多種鍵值數據類型來適應不同場景下的存儲需求,目前為止Redis支持的鍵值數據類型如下:

  · 字符串類型 string(常用:json/xml)

  · 散列類型 hash(key value key--value(map) )

  · 列表類型 list linkedlist 用戶列表

  · 集合類型 set

  · 有序集合類型 sortedset

  Redis的應用場景

  · 緩存(數據查詢、短連接、新聞內容、商品內容等等)

  · 聊天室的在線好友列表

  · 任務隊列(開發(fā)中常用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將為該鍵創(chuàng)建一個新的鏈表。

  如果鏈表中所有的元素均被移除,那么該鍵也將會被從數據庫中刪除。

  List中可以包含的最大元素數量是4294967295

  集合類型set

  在Redis中,我們可以將Set類型看作為沒有排序的字符集合,和List類型一樣,我們也可以在該類型的數據值上執(zhí)行添加、刪除或判斷某一元素是否存在等操作。需要說明的是,這些操作的時間復雜度為O(1),即常量時間內完成次操作。Set可包含的最大元素數量是4294967295,和List類型不同的是,Set集合中不允許出現重復的元素。

  其他:

  Redis5.0 新增 API Timesand cluster api RDB現在存儲LFU和LRU LFU --》叫做最近最少使用算法 LRU--->叫做最近最常使用算法

  集群管理器從Ruby移植到C代碼 通過Redis腳本可以直接創(chuàng)建

  新的sorted set命令 ZPOPMIN/MAX 和 阻塞變種 作用去除集合中分值最大和最小的值

  主動內存碎片整理

  增強HyperLogLog實現 通過算法估算內存基數

  更好的內存統計報告

  更好的幫助命令

  客戶端經常連接和斷開性能更好

  錯誤修復和改進

  jemjemalloc升級到5.1版本 內存分配器



作者:黑馬程序員JavaEE培訓學院
首發(fā):http://java.itheima.com/

分享到:
在線咨詢 我要報名
和我們在線交談!