Update(stage3):第1節 redis組件:1 - 三、web發展歷史以及redis簡介

Redis課程教案

一、 NoSQL數據庫的發展歷史簡介

一、web系統的變遷歷史

 

web1.0時代簡介

基本上就是一些簡單的靜態頁面的渲染,不會涉及到太多的複雜業務邏輯,功能簡單單一,基本上服務器性能不會有太大壓力前端

缺點:一、Service 愈來愈多,調用關係變複雜,前端搭建本地環境再也不是一件簡單的事。考慮團隊協做,每每會考慮搭建集中式的開發服務器來解決。這種解決方案對編譯型的後端開發來講也許還好,但對前端開發來講並不友好。天哪,我只是想調整下按鈕樣式,卻要本地開發、代碼上傳、驗證生效等好幾個步驟。也許習慣了也還好,但開發服務器老是不那麼穩定,出問題時每每須要依賴後端開發搞定。看似僅僅是前端開發難以本地化,但這對研發效率的影響其實蠻大。nginx

二、JSP 等代碼的可維護性愈來愈差。JSP 很是強大,能夠內嵌 Java 代碼。這種強大使得先後端的職責不清晰,JSP 變成了一個灰色地帶。常常爲了趕項目,爲了各類緊急需求,會在 JSP 裏揉雜大量業務代碼。積攢到必定階段時,每每會帶來大量維護成本。程序員

 

web2.0時代簡介

 

 

 

隨着Web2.0的時代的到來,用戶訪問量大幅度提高,同時產生了大量的用戶數據。加上後來的智能移動設備的普及,全部的互聯網平臺都面臨了巨大的性能挑戰。包括web服務器CPU及內存壓力。數據庫服務器IO壓力等web

 

爲了解決服務器的性能壓力問題,出現了各類各樣的解決方案,最典型的就是使用MVC的架構,MVC 是個很是好的協做模式,從架構層面讓開發者懂得什麼代碼應該寫在什麼地方。爲了讓 View 層更簡單幹脆,還能夠選擇 Velocity、Freemaker 等模板,使得模板裏寫不了 Java 代碼。看起來是功能變弱了,但正是這種限制使得先後端分工更清晰。可是一樣也會面臨如下問題redis

 

一、前端開發重度依賴開發環境。這種架構下,先後端協做有兩種模式:一種是前端寫 demo,寫好後,讓後端去套模板。淘寶早期包括如今依舊有大量業務線是這種模式。好處很明顯,demo 能夠本地開發,很高效。不足是還須要後端套模板,有可能套錯,套完後還須要前端肯定,來回溝通調整的成本比較大。另外一種協做模式是前端負責瀏覽器端的全部開發和服務器端的 View 層模板開發,支付寶是這種模式。好處是 UI 相關的代碼都是前端去寫就好,後端不用太關注,不足就是前端開發重度綁定後端環境,環境成爲影響前端開發效率的重要因素。sql

 

二、先後端職責依舊糾纏不清。Velocity 模板仍是蠻強大的,變量、邏輯、宏等特性,依舊能夠經過拿到的上下文變量來實現各類業務邏輯。這樣,只要前端弱勢一點,每每就會被後端要求在模板層寫出很多業務代碼。還有一個很大的灰色地帶是 Controller,頁面路由等功能本應該是前端最關注的,但倒是由後端來實現。Controller 自己與 Model 每每也會糾纏不清,看了讓人咬牙的代碼常常會出如今 Controller 層。這些問題不能全歸結於程序員的素養,不然 JSP 就夠了。數據庫

 

關於如何解決Web服務器的負載壓力,其中最經常使用的一種方式就是使用nginx實現web集羣的服務轉發以及服務拆分等等json

 

 

 

可是這樣也會存在問題,後端服務器的多個tomcat之間如何解決session共享的問題,以及session存放的問題等等後端

爲了解決session存放的問題,也有多種解決方案瀏覽器

方案一:存放在cookie裏面。不安全,否認

方案二:存放在文件或者數據庫當中。速度慢

方案三:session複製。大量session冗餘,節點浪費大

方案四:使用NoSQL緩存數據庫。例如redis或者memcache等,完美解決

 

 

NoSQL適用場景

 

  • 對數據高併發的讀寫
  • 海量數據的讀寫
  • 對數據高可擴展性的
  • 速度夠快,可以快速的存取數據

NoSQL不適用場景

  • 須要事務支持
  • 基於sql的結構化查詢存儲,處理複雜的關係,須要即席查詢(用戶自定義查詢條件的查詢)。

 

 

總結:用不着sql的和用了sql也不行的狀況,請考慮用NoSql

二、 NoSQL數據庫兄弟會

一、memcache介紹

  • 很早出現的NoSql數據庫
  • 數據都在內存中,通常不持久化
  • 支持簡單的key-value模式
  • 通常是做爲緩存數據庫輔助持久化的數據庫
  • 幾乎覆蓋了Memcached的絕大部分功能
  • 數據都在內存中,支持持久化,主要用做備份恢復
  • 除了支持簡單的key-value模式,還支持多種數據結構的存儲,好比 list、set、hash、zset等。
  • 通常是做爲緩存數據庫輔助持久化的數據庫
  • 如今市面上用得很是多的一款內存數據庫
  • 高性能、開源、模式自由(schema  free)的文檔型數據庫
  • 數據都在內存中, 若是內存不足,把不經常使用的數據保存到硬盤
  • 雖然是key-value模式,可是對value(尤爲是json)提供了豐富的查詢功能
  • 支持二進制數據及大型對象
  • 能夠根據數據的特色替代RDBMS ,成爲獨立的數據庫。或者配合RDBMS,存儲特定的數據。
    • HBase是Hadoop項目中的數據庫。它用於須要對大量的數據進行隨機、實時的讀寫操做的場景中。HBase的目標就是處理數據量很是龐大的表,能夠用普通的計算機處理超過10億行數據,還可處理有數百萬列元素的數據表。

二、redis介紹

三、mongoDB介紹

四、列式存儲HBase介紹

三、 Redis的基本介紹以及使用場景

redis官網地址:

https://redis.io/

中文網站

http://www.redis.cn/

3.一、redis的基本介紹

 

 Redis是當前比較熱門的NOSQL系統之一,它是一個開源的使用ANSI c語言編寫的key-value存儲系統(區別於MySQL的二維表格的形式存儲。)。和Memcache相似,但很大程度補償了Memcache的不足。和Memcache同樣,Redis數據都是緩存在計算機內存中,不一樣的是,Memcache只能將數據緩存到內存中,沒法自動按期寫入硬盤,這就表示,一斷電或重啓,內存清空,數據丟失。因此Memcache的應用場景適用於緩存無需持久化的數據。而Redis不一樣的是它會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,實現數據的持久化

 

3.二、redis的適用場景

 

1.取最新N個數據的操做

好比典型的取你網站的最新文章,經過下面方式,咱們能夠將最新的5000條評論的ID放在Redis的List集合中,並將超出集合部分從數據庫獲取

  • 使用LPUSH latest.comments<ID>命令,向list集合中插入數據
  • 插入完成後再用LTRIM latest.comments 0 5000命令使其永遠只保存最近5000個ID
  • 而後咱們在客戶端獲取某一頁評論時能夠用下面的邏輯(僞代碼)

FUNCTION get_latest_comments(start,num_items):

    id_list = redis.lrange("latest.comments",start,start+num_items-1)

    IF id_list.length < num_items

        id_list = SQL_DB("SELECT ... ORDER BY time LIMIT ...")

    END

    RETURN id_list

END

若是你還有不一樣的篩選維度,好比某個分類的最新N條,那麼你能夠再建一個按此分類的List,只存ID的話,Redis是很是高效的。

2.排行榜應用,取TOP N操做

這個需求與上面需求的不一樣之處在於,前面操做以時間爲權重,這個是以某個條件爲權重,好比按頂的次數排序,這時候就須要咱們的sorted set出馬了,將你要排序的值設置成sorted set的score,將具體的數據設置成相應的value,每次只須要執行一條ZADD命令便可。

3.須要精準設定過時時間的應用

好比你能夠把上面說到的sorted set的score值設置成過時時間的時間戳,那麼就能夠簡單地經過過時時間排序,定時清除過時數據了,不只是清除Redis中的過時數據,你徹底能夠把Redis裏這個過時時間當成是對數據庫中數據的索引,用Redis來找出哪些數據須要過時刪除,而後再精準地從數據庫中刪除相應的記錄。

4.計數器應用

Redis的命令都是原子性的,你能夠輕鬆地利用INCR,DECR命令來構建計數器系統。

5.Uniq操做,獲取某段時間全部數據排重值

這個使用Redis的set數據結構最合適了,只須要不斷地將數據往set中扔就好了,set意爲集合,因此會自動排重。

6.實時系統,反垃圾系統

經過上面說到的set功能,你能夠知道一個終端用戶是否進行了某個操做,能夠找到其操做的集合並進行分析統計對比等。沒有作不到,只有想不到。

7.Pub/Sub構建實時消息系統

Redis的Pub/Sub系統能夠構建實時的消息系統,好比不少用Pub/Sub構建的實時聊天系統的例子。

8.構建隊列系統

使用list能夠構建隊列系統,使用sorted set甚至能夠構建有優先級的隊列系統。

9.緩存

將數據直接存放到內存中,性能優於Memcached,數據結構更多樣化。

 

3.三、redis的特色

高效性:Redis讀取的速度是110000次/s,寫的速度是81000次/s

原子性:Redis的全部操做都是原子性的,同時Redis還支持對幾個操做全並後的原子性執行。

支持多種數據結構:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)

穩定性:持久化,主從複製(集羣)

其餘特性:支持過時時間,支持事務,消息訂閱。

相關文章
相關標籤/搜索