Memcached和Redis簡介

来源:http://www.cnblogs.com/programlearning/archive/2017/05/23/6893890.html
-Advertisement-
Play Games

前言: 目前比較流行的緩存技術無疑是Memcached和Redis,兩套緩存技術有著諸多的相似之處,但又具備大量的顯著差異,作為新生的方案,Redis被視為首選,但是有些場景Memcached發揮的作用是不容忽視的。 相似點: 1. Memcached和Redis都屬於In-Memory、Key-V ...


前言:

        目前比較流行的緩存技術無疑是Memcached和Redis,兩套緩存技術有著諸多的相似之處,但又具備大量的顯著差異,作為新生的方案,Redis被視為首選,但是有些場景Memcached發揮的作用是不容忽視的。

相似點:

         1. Memcached和Redis都屬於In-Memory、Key-Value數據存儲方案,同屬於NoSQL家族,都選擇將全部數據存儲在記憶體中。

         2. 都是成熟的開源項目,Memcached由Brad Fitzpatrick 2003年開發而成,Redis則由Salvatore Sanfilippo於2009創建。

         3. 簡單易用,只需幾分鐘就可以完成安裝工作。

不同之處:

         1. Redis支持伺服器端的數據操作: Redis相對Memcached擁有更多的數據結構,支持豐富的數據操作。

         2. 記憶體使用率:Memcached簡單的key-value存儲,記憶體利用率更高,而如果Redis採用hash結構來做Key-value存儲,由於組合式的壓縮,記憶體利用率更高。

         3.性能對比:Redis單核,Memcached可以使用多核,所以平均每一個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis最近也在存儲大數據的性能上進行優化,但是比起Memcached,還有些差距。

結合以上特性下麵從兩者的事件模型,記憶體管理,數據類型、集群管理、持久化詳細講解一下

一、事件模型

      相同之處:都是用epol來做事件迴圈

      不同之處:redis是單線程伺服器(這裡的單線程是指除了主線程以外其他線程沒有event loop),redis事件模型只有一個event loop,是最簡單的reactor的實現。redis事件模型中有一個亮點,redis裡面的fd(詳細請百度)就是伺服器與客戶端連接socket的fd,通常根據fd找到具體的客戶端信息,通常的處理方式就是用紅黑樹將fd與客戶端信息保存起來,通過fd查找,效率是lgn,不過redis比較特殊,redis客戶端的數量上限可以設置,即同一時刻知道redis打開的fd的上限,且進程的fd在同一時刻是不會重覆的,所以redis使用一個數據,將fd作為數組的下標,數組的元素就是客戶端的信息,這樣通過fd就能訂位客戶端信息,查找效率是O(1),省去了紅黑樹的實現。

       Memcached是多線程的,使用Master-Worker的方式,其中主線程負責接收連接,然後將連接分給各個worker線程,在各個worker線程中完成命令的接收,處理和返回結果。

二、記憶體管理

  1. Memcached使用預先分配,預先分配一大塊記憶體,然後接下來就從記憶體池中分配,這樣可以減少記憶體的分配次數,提高效率。Memcached的採用Slab Allocation,記憶體的結構決定了Value值的大小最大隻能為1MB。

       Slab Allocation的原理:將分配的記憶體分割成各種尺寸的塊(chunk),並把尺寸相同的塊分成組,每一組被稱為slab。Memcached的記憶體分配以Page為單位,Page預設值為1M,可以在啟動時通過-I參數來指定。Slab是由多個Page組成的,Page按照指定大小切割成多個chunk。memcached在啟動時通過-f選項可以指定 Growth Factor因數。該值控制slab之間的差異,chunk大小的差異。預設值為1.25。其結構圖如下:

 

  優缺點:Slab Allocation可以有效的解決記憶體碎片的問題,但是也會造成記憶體的浪費

             1.每個slab的chunk大小是固定的,當item的占用空間實際小於chunk大小時,會出現記憶體浪費

             2.每個slab的大小是固定的(因為page是固定的),當slab不能被他所擁有的chunk整除時,會出現記憶體浪費

             3.按照Growth Factor因數生成指定大小的slab,而某slab id根本未被使用時,會出現記憶體浪費

   2. Redis使用動態分配,由於C語言沒有自帶的GC,所以Redis的實現中封裝了C的malloc,calloc,realloc和free函數來對自己的記憶體進行管理,這些實現都在zmalloc.h和zmalloc.c中。在Redis中,並不是所有的數據一直存儲在記憶體中。當物理記憶體用完時,Redis可以將一些很久沒用的Value交換到磁碟。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中讀取數據的時候,如果讀取的key對應的value不在記憶體中,那麼Redis就需要從swap文件中載入相應數據,然後再返回給請求方。 這裡就存在一個I/O線程池的問題。在預設的情況下,Redis會出現阻塞,即完成所有的swap文件載入後才會相應。這種策略在客戶端的數量較小,進行批量操作的時候比較合適。但是如果將Redis應用在一個大型的網站應用程式中,這顯然是無法滿足大併發的情況的。所以Redis運行我們設置I/O線程池的大小,對需要從swap文件中載入相應數據的讀取請求進行併發操作,減少阻塞的時間。

三、數據類型

     Memcached僅支持簡單的key-value結構的數據,Redis支持的數據類型要豐富得多。常用的由五種:String、Hash、List、Set和Sorted Set。Redis內部使用一個redisObject對象來表示所有的key和value。

四:集群管理

     Memcached本身並不支持分散式,只能在客戶端通過一致性hash這樣的分散式演算法來實現Memcached的分散式存儲。 Redis更偏向服務端構建分散式存儲,Redis Cluster是一個實現了分散式且允許單點故障的Redis高級版本,去中心化,具有線性可伸縮的功能。節點與節點之間通過二進位協議進行通信,節點與客戶端之間通過ascii協議進行通信。在數據的放置策略上,Redis Cluster將整個key的數值域分成4096個哈希槽,每個節點上可以存儲一個或多個哈希槽,也就是說當前Redis Cluster支持的最大節點數就是4096。Redis Cluster使用的分散式演算法也很簡單:crc16( key ) % HASH_SLOTS_NUMBER。

五:數據持久化

     Memcached不支持數據持久化。Redis支持兩種數據持久化RDB快照和AOF日誌。

     Redis Cluster引入了master-slave模式,每一個master都對應兩個slave節點。

 整體上說,兩者的性能都很好,不必為哪個性能更高而糾結。不過,redis提供的持久化和數據同步機制,這些都是memcached沒有的,所以如果你想要持久化,就只能用redis了。另外,memcached足以應付簡單的鍵值存儲,不過你要是想用更高級的數據結構,比如hash,list,set,zset之類的,redis提供了這些類型,用著更方便。 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • php-人員許可權管理(RBAC) 許可權管理可以想做vip的功能,普通用戶和vip用戶的功能是不一樣的,大致會用到五張表:用戶表、角色表、功能表,還有他們之間互相關聯的表:用戶與角色表、角色與功能表 我用到的五張表如下: 一.首先寫的是管理員頁面 1.用下拉列表顯示用戶名 2.因為上面已經造了新對象, ...
  • 1 ...
  • ★★ 輸入文件:roads.in 輸出文件:roads.out 簡單對比 時間限制:1 s 記憶體限制:128 MB 譯 by CmYkRgB123 描述 Farmer John 剛剛得到了幾個新農場!他想把這幾個農場用路連接起來,這樣他就可以通過筆直的公路從一個農場到另一個農場了。現在已經有了幾條連 ...
  • 目標:用Python抓取實習僧網站上數據分析相關崗位信息,並用Python做可視化分析 軟體:Python 3.0 版本 一、 實習僧網站爬蟲介紹 實習僧網址:http://www.shixiseng.com/ 在搜索框輸入 數據 然後跳轉到一下頁面,Fn + f12 就能看到網頁調試工具。 刷新頁 ...
  • 轉載請出自出處:http://www.cnblogs.com/hd3013779515/ 1.安裝JAVA、Git、Maven 安裝過程省略,請自行百度。 2.編譯dubbo (1)從https://github.com/alibaba/dubbo/releases下載dubbo-dubbo-2.5 ...
  • 設計模式四--建造者模式 一、定義 將一個複雜對象呢的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 二、優點 封裝性 建造者獨立,容易擴展 三、原理圖 Product代表具體的產品 ConcreteBuilder是這些產品建造過程的一個介面 Builder是這些產品的具體建造實例,實現 ...
  • 開閉原則是面向對象設計的一個重要原則,其定義如下: 開閉原則(Open-Closed Principle, OCP):一個軟體實體應當對擴展開放,對修改關閉。即軟體實體應儘量在不修改原有代碼的情況下進行擴展。 在軟體的生命周期內,因為變化、升級和維護等原因需要對軟體原有代碼進行修改時,可能會給舊代碼 ...
  • 單例模式要求類能夠有返回對象一個引用(永遠是同一個)和一個獲得該實例的方法,比如在某個伺服器程式中,該伺服器的配置信息存放在一個文件中,這些配置數據由一個單例對象統一讀取,然後服務進程中的其他對象再通過這個單例對象獲取這些配置信息。這種方式簡化了在複雜環境下的配置管理。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...