Redis+Mysql模式和內存+硬盤模式的異同

學習任何新知識,都是一個循序漸進的過程,從剛開始的懵懂無知,到簡單熟悉,然後突然的徹悟,成果讓人欣喜若狂,心情也會快樂很久。

redis+mysql和內存+硬盤類似的地方

首先看圖:

1341569850_8344.png

首先,我們知道,mysql是持久化存儲,存放在磁盤裏面,檢索的話,會涉及到一定的IO,爲了解決這個瓶頸,於是出現了緩存,比如現在用的最多的memcached(簡稱mc)。首先,用戶訪問mc,如果未命中,就去訪問mysql,之後像內存和硬盤一樣,把數據複製到mc一部分。

redismc都是緩存,並且都是駐留在內存中運行的,這大大提升了高數據量web訪問的訪問速度。然而mc只是提供了簡單的數據結構,比如string存儲;redis卻提供了大量的數據結構,比如stringlistsethashsetsorted 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=10id=9999的數據放到redis,用於下次訪問。可是關鍵在於mysql數據的訪問,並不是文件這種局部性原理,不同的用戶訪問的是完全不同的東西,跟id的次序沒有任何關係。

其實redis的強項也不在此,它擅長保存元數據類的數據,也就是說描述性的而不是數據本身

就此我假定了redis的幾個應用場景,請大家批評指正:

存放計數器的數字

存放檢索關鍵詞的id列表(不放內容)

存放用戶之間的follow關係(非用戶信息)

存放簡單的靜態Html,而非所有的CSSJS

總之發現,就是redis大量存放的是數據表的索引字段,如果剛好用到符合條件的信息,可以根據索引字段,再去mysql查找,比如搜索關鍵詞”redis”,第一步我們去mysql獲取redis相關的信息返回給用戶,然後記錄一個zset,將redis作爲名字,將搜索到的每個Id以先後順序存在裏面,那麼下次有人搜索”redis”,直接根據該列表去mysql找對應id的信息就行了,這已經大大提升了訪問速度。

下圖是一個檢索的流程圖:

1341569817_4804.png


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章