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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...