標籤:
http://www.open-open.com/lib/view/open1346029825942.html
學習任何新知識,都是一個循序漸進的過程,從剛開始的懵懂無知,到簡單熟悉,然後突然的徹悟,成果讓人欣喜若狂,心情也會快樂很久。
redis+mysql和記憶體+硬碟類似的地方
首先看圖:
首先,我們知道,mysql是持久化儲存,存放在磁碟裡面,檢索的話,會涉及到一定的IO,為瞭解決這個瓶頸,於是出現了緩衝,比如現在用的最多的 memcached(簡稱mc)。首先,使用者訪問mc,如果未命中,就去訪問mysql,之後像記憶體和硬碟一樣,把資料複製到mc一部分。
redis和mc都是緩衝,並且都是駐留在記憶體中啟動並執行,這大大提升了高資料量web訪問的訪問速度。然而mc只是提供了簡單的資料結構,比如 string儲存;redis卻提供了大量的資料結構,比如string、list、set、hashset、sorted set這些,這使得使用者方便了好多,畢竟封裝了一層實用的功能,同時實現了同樣的效果,當然用redis而慢慢捨棄mc。
記憶體和硬碟的關係,硬碟放置主體資料用於持久化儲存,而記憶體則是當前啟動並執行那部分資料,CPU訪問記憶體而不是磁碟,這大大提升了啟動並執行速度,當然這是基於程式的局部化訪問原理。
推理到redis+mysql,它是記憶體+磁碟關係的一個映射,mysql放在磁碟,redis放在記憶體,這樣的話,web應用每次只訪問redis,如果沒有找到的資料,才去訪問Mysql。
然而redis+mysql和記憶體+磁碟的用法最好是不同的。
redis+mysql和記憶體+硬碟運行模式是不同的瞭解過記憶體和硬碟運行過程的同學,都知道他倆之間通過頁面置換演算法進行調度,也就是說每次是按塊將資料從硬碟換入或者換出記憶體,比如硬碟有一個100G的檔案,如果要讀這個檔案,記憶體中每次只放該檔案10MB的一部分(圖1中的小塊就是這個意思)。
於是有人會猜測,mysql儲存了100G的資料,使用者訪問mysql的時候,把10MB資料拷貝到redis,比如select一個id=1000的數 據,那就把id=10到id=9999的資料放到redis,用於下次訪問。可是關鍵在於mysql資料的訪問,並不是檔案這種局部性原理,不同的使用者訪 問的是完全不同的東西,跟id的次序沒有任何關係。
其實redis的強項也不在此,它擅長儲存中繼資料類的資料,也就是說描述性的而不是資料本身
就此我假定了redis的幾個應用情境,請大家批評指正:
- 存放計數器的數字
- 存放檢索關鍵詞的id列表(不放內容)
- 存放使用者之間的follow關係(非使用者資訊)
- 存放簡單的靜態Html,而非所有的CSS和JS
總之發現,就是redis大量存放的是資料表的索引欄位,如果剛好用到合格資訊,可以根據索引欄位,再去 mysql尋找,比如搜尋關鍵詞”redis”,第一步我們去mysql擷取redis相關的資訊返回給使用者,然後記錄一個zset,將redis作為名 字,將搜尋到的每個Id以先後順序存在裡面,那麼下次有人搜尋”redis”,直接根據該列表去mysql找對應id的資訊就行了,這已經大大提升了訪問 速度。
是一個檢索的流程圖:
Redis+Mysql模式和記憶體+硬碟模式的異同