<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    Redis與Memcached的區別

    傳統MySQL+ Memcached架構遇到的問題

      實際MySQL是適合進行海量數據存儲的,通過Memcached將熱點數據加載到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務數據量的不斷增加,和訪問量的持續增長,我們遇到了很多問題:

      1.MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟著擴容,擴容和維護工作占據大量開發時間。

      2.Memcached與MySQL數據庫數據一致性問題。

      3.Memcached數據命中率低或down機,大量訪問直接穿透到DB,MySQL無法支撐。

      4.跨機房cache同步問題。

      眾多NoSQL百花齊放,如何選擇

       最近幾年,業界不斷涌現出很多各種各樣的NoSQL產品,那么如何才能正確地使用好這些產品,最大化地發揮其長處,是我們需要深入研究和思考的問題,實 際歸根結底最重要的是了解這些產品的定位,并且了解到每款產品的tradeoffs,在實際應用中做到揚長避短,總體上這些NoSQL主要用于解決以下幾 種問題

      1.少量數據存儲,高速讀寫訪問。此類產品通過數據全部in-momery 的方式來保證高速訪問,同時提供數據落地的功能,實際這正是Redis最主要的適用場景。

      2.海量數據存儲,分布式系統支持,數據一致性保證,方便的集群節點添加/刪除。

      3.這方面最具代表性的是dynamo和bigtable 2篇論文所闡述的思路。前者是一個完全無中心的設計,節點之間通過gossip方式傳遞集群信息,數據保證最終一致性,后者是一個中心化的方案設計,通過類似一個分布式鎖服務來保證強一致性,數據寫入先寫內存和redo log,然后定期compat歸并到磁盤上,將隨機寫優化為順序寫,提高寫入性能。

      4.Schema free,auto-sharding等。比如目前常見的一些文檔數據庫都是支持schema-free的,直接存儲json格式數據,并且支持auto-sharding等功能,比如mongodb。

      面對這些不同類型的NoSQL產品,我們需要根據我們的業務場景選擇最合適的產品。

      Redis適用場景,如何正確的使用

       前面已經分析過,Redis最適合所有數據in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功 能,跟傳統意義上的持久化有比較大的差別,那么可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那么何時使用 Memcached,何時使用Redis呢?

     

    如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:

    1  Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。

    2  Redis支持數據的備份,即master-slave模式的數據備份。

    3  Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用。

    拋開這些,可以深入到Redis內部構造去觀察更加本質的區別,理解Redis的設計。

    在Redis中,并不是所有的數據都一直存儲在內存中的。這是和Memcached相比一個最大的區別。Redis只會緩存所有的 key的信息,如果Redis發現內存的使用量超過了某一個閥值,將觸發swap的操作,Redis根據“swappability = age*log(size_in_memory)”計 算出哪些key對應的value需要swap到磁盤。然后再將這些key對應的value持久化到磁盤中,同時在內存中清除。這種特性使得Redis可以 保持超過其機器本身內存大小的數據。當然,機器本身的內存必須要能夠保持所有的key,畢竟這些數據是不會進行swap操作的。同時由于Redis將內存 中的數據swap到磁盤中的時候,提供服務的主線程和進行swap操作的子線程會共享這部分內存,所以如果更新需要swap的數據,Redis將阻塞這個 操作,直到子線程完成swap操作后才可以進行修改。

    使用Redis特有內存模型前后的情況對比:
    VM off: 300k keys, 4096 bytes values: 1.3G used
    VM on:  300k keys, 4096 bytes values: 73M used
    VM off: 1 million keys, 256 bytes values: 430.12M used
    VM on:  1 million keys, 256 bytes values: 160.09M used
    VM on:  1 million keys, values as large as you want, still: 160.09M used

    當 從Redis中讀取數據的時候,如果讀取的key對應的value不在內存中,那么Redis就需要從swap文件中加載相應數據,然后再返回給請求方。 這里就存在一個I/O線程池的問題。在默認的情況下,Redis會出現阻塞,即完成所有的swap文件加載后才會相應。這種策略在客戶端的數量較小,進行 批量操作的時候比較合適。但是如果將Redis應用在一個大型的網站應用程序中,這顯然是無法滿足大并發的情況的。所以Redis運行我們設置I/O線程 池的大小,對需要從swap文件中加載相應數據的讀取請求進行并發操作,減少阻塞的時間。

    如果希望在海量數據的環境中使用好Redis,我相信理解Redis的內存設計和阻塞的情況是不可缺少的。

     

    補充的知識點:

    memcached和redis的比較

    1 網絡IO模型

       Memcached是多線程,非阻塞IO復用的網絡模型,分為監聽主線程和worker子線程,監聽線程監聽網絡連接,接受請求后,將連接描述字 pipe 傳遞給worker線程,進行讀寫IO, 網絡層使用libevent封裝的事件庫,多線程模型可以發揮多核作用,但是引入了cache coherency和鎖的問題,比如,Memcached最常用的stats 命令,實際Memcached所有操作都要對這個全局變量加鎖,進行計數等工作,帶來了性能損耗。

    (Memcached網絡IO模型)

       Redis使用單線程的IO復用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和select,對于單純 只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對于這些操作,單線程模型實際會嚴重 影響整體吞吐量,CPU計算過程中,整個IO調度都是被阻塞住的。

      2.內存管理方面

       Memcached使用預分配的內存池的方式,使用slab和大小不同的chunk來管理內存,Item根據大小選擇合適的chunk存儲,內存池的方 式可以省去申請/釋放內存的開銷,并且能減小內存碎片產生,但這種方式也會帶來一定程度上的空間浪費,并且在內存仍然有很大空間時,新的數據也可能會被剔 除,原因可以參考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/

       Redis使用現場申請內存的方式來存儲數據,并且很少使用free-list等方式來優化內存分配,會在一定程度上存在內存碎片,Redis跟據存儲 命令參數,會把帶過期時間的數據單獨存放在一起,并把它們稱為臨時數據,非臨時數據是永遠不會被剔除的,即便物理內存不夠,導致swap也不會剔除任何非 臨時數據(但會嘗試剔除部分臨時數據),這點上Redis更適合作為存儲而不是cache。

      3.數據一致性問題

      Memcached提供了cas命令,可以保證多個并發訪問操作同一份數據的一致性問題。 Redis沒有提供cas 命令,并不能保證這點,不過Redis提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷。

      4.存儲方式及其它方面

      Memcached基本只支持簡單的key-value存儲,不支持枚舉,不支持持久化和復制等功能

      Redis除key/value之外,還支持list,set,sorted set,hash等眾多數據結構,提供了KEYS

      進行枚舉操作,但不能在線上使用,如果需要枚舉線上數據,Redis提供了工具可以直接掃描其dump文件,枚舉出所有數據,Redis還同時提供了持久化和復制等功能。

      5.關于不同語言的客戶端支持

       在不同語言的客戶端方面,Memcached和Redis都有豐富的第三方客戶端可供選擇,不過因為Memcached發展的時間更久一些,目前看在客 戶端支持方面,Memcached的很多客戶端更加成熟穩定,而Redis由于其協議本身就比Memcached復雜,加上作者不斷增加新的功能等,對應 第三方客戶端跟進速度可能會趕不上,有時可能需要自己在第三方客戶端基礎上做些修改才能更好的使用。

      根據以上比較不難看出,當我們不希望數據被踢出,或者需要除key/value之外的更多數據類型時,或者需要落地功能時,使用Redis比使用Memcached更合適。

      關于Redis的一些周邊功能

       Redis除了作為存儲之外還提供了一些其它方面的功能,比如聚合計算、pubsub、scripting等,對于此類功能需要了解其實現原理,清楚地 了解到它的局限性后,才能正確的使用,比如pubsub功能,這個實際是沒有任何持久化支持的,消費方連接閃斷或重連之間過來的消息是會全部丟失的,又比 如聚合計算和scripting等功能受Redis單線程模型所限,是不可能達到很高的吞吐量的,需要謹慎使用。

      總的來說Redis作者是一位非常勤奮的開發者,可以經常看到作者在嘗試著各種不同的新鮮想法和思路,針對這些方面的功能就要求我們需要深入了解后再使用。

      總結:

      1.Redis使用最佳方式是全部數據in-memory。

      2.Redis更多場景是作為Memcached的替代者來使用。

      3.當需要除key/value之外的更多數據類型支持時,使用Redis更合適。

      4.當存儲的數據不能被剔除時,使用Redis更合適。

    posted on 2014-05-23 12:38 paulwong 閱讀(4008) 評論(0)  編輯  收藏 所屬分類: REDIS

    主站蜘蛛池模板: 亚洲成aⅴ人片在线观| 看成年女人免费午夜视频| 好大好硬好爽免费视频| 亚洲欧美日韩综合久久久久 | 亚洲一级免费毛片| 亚洲精品无码中文久久字幕| 久久亚洲av无码精品浪潮| 69成人免费视频| 黄色短视频免费看| 亚洲免费在线视频观看| 亚洲毛片av日韩av无码| 免费精品国偷自产在线在线| 精品无码一级毛片免费视频观看| 亚洲国产美女精品久久| 亚洲女同成人AⅤ人片在线观看 | 日韩国产免费一区二区三区| 又粗又长又爽又长黄免费视频 | 亚洲婷婷五月综合狠狠爱| 最近免费2019中文字幕大全| 国产亚洲视频在线| 亚洲福利秒拍一区二区| 免费吃奶摸下激烈视频| 国产成人yy免费视频| 国产成人精品免费视频大全| 亚洲不卡影院午夜在线观看| 亚洲日韩精品无码专区网址| 日本一道综合久久aⅴ免费| 日韩在线永久免费播放| 精品97国产免费人成视频| 亚洲色无码专区一区| 亚洲精品视频观看| 亚洲一区二区三区AV无码| 日韩电影免费在线观看视频| 精品女同一区二区三区免费站| 中文字幕手机在线免费看电影 | 亚洲一区二区三区在线| 久久久久亚洲AV成人无码网站| 一本久到久久亚洲综合| 成人看的午夜免费毛片| h视频在线观看免费完整版| 久久免费精品视频|