深入浅出Redis
一、Redis的誕生
Redis創(chuàng)建者,出生于西西里島的意大利人(antirez)發(fā)明的,個人網(wǎng)站,http://invece.org。早年是系統(tǒng)管理員,2004-2006 年做嵌入式方面的工作,之后接觸 WEB,2007 年和朋友共同創(chuàng)建了一個網(wǎng)站 LLOOGG.com,并為了解決這個網(wǎng)站的負載問題而在 2009 年發(fā)明了 Redis。有關(guān)大數(shù)據(jù)數(shù)據(jù)倉庫問題,請看《傳統(tǒng)數(shù)據(jù)庫和數(shù)據(jù)倉庫》
說到這個 LLOOGG.com 網(wǎng)站,我們來看看這個到底是個干嘛的網(wǎng)站,LLOOGG.com網(wǎng)站是一個訪客信息追蹤網(wǎng)站,網(wǎng)站可以通過 javascript 腳本,將訪客的 IP 地址、所屬國家、閱覽信息、訪問頁面地址等數(shù)據(jù)傳送給 LLOOGG.com。
 
三個網(wǎng)站正在向 LLOOGG.com 發(fā)送它們的訪客瀏覽記錄
然后 LLOOGG.com 會將這些瀏覽數(shù)據(jù)通過 WEB 頁面實時地展示給用戶,并存儲起來最新的 5 到 10000 條瀏覽記錄以便進行查閱,就是說用戶可以設(shè)置想看最近的多少條。
這個就是 LLOOGG.com 的用戶界面,ps:Google 的 Analytics知道 2011 年才有了實時功能,所以說 LLOOGG.com 的實時反饋想法在當時 2007 年還是很有新意的。
LLOOGG 的運作方式
各個網(wǎng)站發(fā)送的瀏覽記錄會分別進入相應的隊列
 
FIFO 機制,當列表的長度超過用戶指定的最大長度時,程序每向列表推入一條記錄,就需要從列表中彈出一條最舊的記錄,圖中展示比如用戶設(shè)置列表最大長度為 5
 LLOOGG 怎么引起負載問題的呢?
隨著 LLOOGG 的用戶越來越多,LLOOGG 要維護的列表數(shù)量也越來越多,要執(zhí)行的推入和彈出操作也越來越多,當時 LLOOGG 當時使用 MYSQL 數(shù)據(jù)庫,而每次 MYSQL執(zhí)行推入和彈出操作都要進行硬盤寫入和讀取,程序的性能嚴重受制于硬盤 I/O,很多操作都堆在那里,然后網(wǎng)站整個就沒法運作了。
 這個負載問題的根本原因就是這個硬盤 IO,所以 antirez 在不改變硬件的基礎(chǔ)上,通過提升列表操作的性能來解決負載問題,決定自己寫一個具有列表結(jié)構(gòu)的內(nèi)存數(shù)據(jù)庫原型。最重要的是數(shù)據(jù)存儲在內(nèi)存而不是硬盤,所以程序的性能不會受到硬盤 IO 限制,可以以極快的速度執(zhí)行針對列表的堆入和彈出操作。結(jié)果試驗,確實解決了 LLOOGG 當時
二、Redis特點
世界上有無數(shù)種數(shù)據(jù)庫,為什么要使用 Redis 呢,我們來看看它的優(yōu)點
2.1獨特的鍵值對模型
我們知道很多數(shù)據(jù)庫只能處理一種數(shù)據(jù)結(jié)構(gòu):
      SQL數(shù)據(jù)庫----二維表格
文檔數(shù)據(jù)庫(CouchDB、MongoDB)----由 JSON/BSON 組成的文檔
2.2數(shù)據(jù)結(jié)構(gòu)豐富
Redis 雖然也是鍵值對數(shù)據(jù)庫,但是和 Memcached 不同的是,Redis 支持多種類型的數(shù)據(jù)結(jié)構(gòu),不僅可以是字符串,同時還提供散列(hashes),列表(lists),集合(sets),有序集合(sorted sets)等數(shù)據(jù)結(jié)構(gòu)。
通過選用不同的數(shù)據(jù)結(jié)構(gòu),用戶可以使用 Redis 解決各式各樣的問題。
數(shù)據(jù)庫有兩種,一種硬盤數(shù)據(jù)庫,一種內(nèi)存數(shù)據(jù)庫
硬盤是把值儲存在硬盤,典型的是 SQL 數(shù)據(jù)庫
在內(nèi)存里面就存儲一下索引,當硬盤數(shù)據(jù)庫想訪問硬盤的值時,它先在內(nèi)存里面找到索引,然后在找值,問題是什么,在讀取和寫入硬盤的時候,如果讀寫比較多的時候,它會把硬盤 IO 堵死。
 至于內(nèi)存數(shù)據(jù)庫,它會直接把值放到內(nèi)存里面,內(nèi)存數(shù)據(jù)庫就直接把值取到,風一樣的感覺,讀寫數(shù)據(jù)的時候都不會受到硬盤 IO 速度的限制,所以速度極快。
2.3數(shù)據(jù)的持久化
Redis支持數(shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時候可以再次加載進行使用。
2.4數(shù)據(jù)的備份
Redis支持數(shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
總結(jié)
                            
                        - 上一篇: 模板 BFS
 - 下一篇: javascript笔记06:类的创建