一文看懂Python Web開(kāi)發(fā)常見(jiàn)數(shù)據(jù)庫(kù)MangoDB, Memcached和Redis
時(shí)間:2023-05-23 20:36:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-05-23 20:36:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
一文看懂Python Web開(kāi)發(fā)常見(jiàn)數(shù)據(jù)庫(kù)MangoDB, Memcached和Redis:在Python Web和Django開(kāi)發(fā)過(guò)程中我們有必要根據(jù)不同的應(yīng)用場(chǎng)景來(lái)選擇非關(guān)系型的數(shù)據(jù)庫(kù)(no-SQL)來(lái)提升網(wǎng)站性能。當(dāng)我們的網(wǎng)站流量變得非常大時(shí),從傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)如MYSQL中讀寫(xiě)數(shù)據(jù)會(huì)變得很消耗時(shí)間和計(jì)算資源。例如當(dāng)MySQL單表數(shù)據(jù)達(dá)到5GB以上時(shí),讀寫(xiě)性能會(huì)有顯著的下降,這時(shí)我們就需要考慮使用其它類型數(shù)據(jù)庫(kù)來(lái)補(bǔ)充了。目前最流行的no-SQL數(shù)據(jù)庫(kù)非MangoDB, Memcached和Redis莫屬了。今天我們就來(lái)介紹下它們的區(qū)別及應(yīng)用場(chǎng)景。
MangoDBmongodb是文檔型的非關(guān)系型no-SQL數(shù)據(jù)庫(kù),其優(yōu)勢(shì)在于查詢功能比較強(qiáng)大,能存儲(chǔ)海量數(shù)據(jù)。對(duì)于中小型網(wǎng)站而言,MySQL和其它關(guān)系型數(shù)據(jù)庫(kù)完全能勝任,不需要使用MangoDB。對(duì)于大中型網(wǎng)站而言,MangoDB可以作為關(guān)系性數(shù)據(jù)庫(kù)很好的補(bǔ)充。MongoDB由于側(cè)重海量數(shù)據(jù)寫(xiě)入性能, 而非事務(wù)安全, 所以很適合存儲(chǔ)業(yè)務(wù)系統(tǒng)中海量“低價(jià)值”的數(shù)據(jù)。對(duì)于事務(wù)要求很高的應(yīng)用比如銀行交易系統(tǒng),MangoDB是不適用的。
MangoDB常見(jiàn)應(yīng)用場(chǎng)景包括爬蟲(chóng)爬來(lái)數(shù)據(jù)的存儲(chǔ),存儲(chǔ)網(wǎng)站的日志,存儲(chǔ)海量用戶的評(píng)論。
值得一提的是,mongodb數(shù)據(jù)和MySQL的數(shù)據(jù)都是保存在磁盤(pán)中的,而不是內(nèi)存中,這是它與Memcached和Redis最大的區(qū)別。MangoDB本質(zhì)上來(lái)看是用來(lái)永久存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)庫(kù),而Memcached和Redis主要用來(lái)做緩存,從這個(gè)角度講Memcached和Redis更像。
MemcachedMemcached是內(nèi)存性數(shù)據(jù)庫(kù),數(shù)據(jù)以Key-Value形式存儲(chǔ),主要用來(lái)提供高性能分布式內(nèi)存緩存服務(wù)。在實(shí)際Web開(kāi)發(fā)過(guò)程中,學(xué)會(huì)利用緩存是非常重要的。在動(dòng)態(tài)網(wǎng)站中,用戶每次請(qǐng)求一個(gè)頁(yè)面,服務(wù)器都會(huì)執(zhí)行以下操作:查詢數(shù)據(jù)庫(kù),渲染模板,執(zhí)行業(yè)務(wù)邏輯,最后生成用戶可查看的頁(yè)面。這會(huì)消耗大量的資源,當(dāng)訪問(wèn)用戶量非常大時(shí),就要考慮這個(gè)問(wèn)題了。緩存就是為了防止重復(fù)計(jì)算,把那些消耗了大量資源的結(jié)果保存起來(lái),下次訪問(wèn)時(shí)就不用再次計(jì)算了,這樣可以大大減輕數(shù)據(jù)庫(kù)的負(fù)載。
由于memcached保存的數(shù)據(jù)都存儲(chǔ)在memcached內(nèi)置的內(nèi)存存儲(chǔ)空間中, 因此重啟memcached、重啟操作系統(tǒng)會(huì)導(dǎo)致全部數(shù)據(jù)消失。另外,內(nèi)容容量達(dá)到指定值之后,就基于LRU(Least Recently Used)算法自動(dòng)刪除不使用的緩存。
Memcached的應(yīng)用場(chǎng)景只有一個(gè): 緩存。例如緩存一個(gè)頁(yè)面,一個(gè)數(shù)據(jù)集或整個(gè)網(wǎng)站。
RedisRedis也是一個(gè)開(kāi)源的key-value存儲(chǔ)系統(tǒng)。與Memcached類似,Redis將大部分?jǐn)?shù)據(jù)存儲(chǔ)在內(nèi)存中,但支持?jǐn)?shù)據(jù)類型更多,包括:字符串、哈希表、鏈表等。區(qū)別的是redis會(huì)周期性的把更新的數(shù)據(jù)寫(xiě)入磁盤(pán)或者把修改操作寫(xiě)入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步。
Redis一般也用來(lái)提供高效的緩存服務(wù),而不是做數(shù)據(jù)的永久存儲(chǔ)。其應(yīng)用場(chǎng)景有緩存和記錄網(wǎng)站日志。
Redis和Memcached都可以設(shè)置緩存數(shù)據(jù)過(guò)期。在實(shí)際Web開(kāi)發(fā)中,數(shù)據(jù)庫(kù)緩存Redis和Memcached基本上是二選一。Redis作為后期之秀,越來(lái)越多搶了Memcached的風(fēng)頭。
Memcached和Redis的區(qū)別- Memcached支持緩存圖片和小文件(比如用戶頭像),redis不支持
- Redis內(nèi)部是支持事務(wù)的,Memcached不支持
- Redis不僅僅支持簡(jiǎn)單的k/v類型的數(shù)據(jù),同時(shí)還提供list,set,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ);
- 存儲(chǔ)數(shù)據(jù)安全--memcache掛掉后,數(shù)據(jù)沒(méi)了;redis可以定期保存到磁盤(pán)
- 災(zāi)難恢復(fù)--memcache掛掉后,數(shù)據(jù)不可恢復(fù); redis數(shù)據(jù)丟失后可以通過(guò)aof恢復(fù);
后續(xù)我們會(huì)介紹Django的緩存系統(tǒng),及如何使用Redis和Memcached緩存。如果你喜歡我們的文章,歡迎訂閱我們的微信公眾號(hào)【Python與Django大咖之路】