Memcached和Redis

MemcachedRedis作為兩種Inmemorykey-value數據庫,在設計和思想方面有著很多共通的地方,功能和應用方面在很多場合下(作為分布式緩存服務器使用等)?也很相似,在這里把兩者放在一起做一下對比的介紹

??

基本架構和思想

?

首先簡單介紹一下兩者的架構和設計思路

?

Memcached

?

Memcached采用客戶端-服務器的架構,客戶端和服務器端的通訊使用自定義的協議標準,只要滿足協議格式要求,客戶端Library可以用任何語言實現。

?

從用戶的角度來說,服務器維護了一個鍵-值關系的數據表,服務器之間相互獨立,互相之間不共享數據也不做任何通訊操作。客戶端需要知道所有的服務器,并自行負責管理數據在各個服務器間的分配。

?

在服務器端,內部的數據存儲,使用基于Slab的內存管理方式,有利于減少內存碎片和頻繁分配銷毀內存所帶來的開銷。各個Slab按需動態分配一個page的內存(和4Kpage的概念不同,這里默認page1M),page內部按照不同slab class的尺寸再劃分為內存chunk供服務器存儲KV鍵值對使用




?

Memcached的基本應用模型如下圖所示

?


?

?

?

Redis

?

Redis的基本應用模式和上圖memcached的基本相似,不難發現網上到處都是關于redis是否可以完全替代memcached使用的問題

?

Redis內部的數據結構最終也會落實到key-Value對應的形式,不過從暴露給用戶的數據結構來看,要比memcached豐富,除了標準的通常意義的鍵值對,Redis還支持ListSet?HashesSorted Set等數據結構

?

基本命令

?

Memcached的命令或者說通訊協議非常簡單,Server所支持的命令基本就是對特定key的添加,刪除,替換,原子更新,讀取等,具體包括?Set, Get, Add, Replace, Append, Inc/Dec?等等

?

Memcached的通訊協議包括文本格式和二進制格式,用于滿足簡單網絡客戶端工具(如telnet)和對性能要求更高的客戶端的不同需求

?

Redis的命令在KVString類型)上提供與Memcached類似的基本操作,在其它數據結構上也支持基本類似的操作(當然還有這些數據結構所特有的操作,如SetunionListpop等)而支持更多的數據結構,在一定程度上也就意味著更加廣泛的應用場合

?

除了多種數據結構的支持,Redis相比Memcached還提供了許多額外的特性,比如Subscribe/publish命令,以支持發布/訂閱模式這樣的通知機制等等,這些額外的特性同樣有助于拓展它的應用場景

?

Redis的客戶端-服務器通訊協議完全采用文本格式(在將來可能的服務器間通訊會采用二進制格式)

?

?

事務

?

redis通過Multi / Watch /Exec等命令可以支持事務的概念,原子性的執行一批命令。在2.6以后的版本中由于添加了對Script腳本的支持,而腳本固有的是以transaction事務的方式執行的,并且更加易于使用,所以不排除將來取消Multi等命令接口的可能性

?

Memcached的應用模式中,除了increment/decrement這樣的原子操作命令,不存在對事務的支持

?

數據備份,有效性,持久化等

?

memcached不保證存儲的數據的有效性,Slab內部基于LRU也會自動淘汰舊數據,客戶端不能假設數據在服務器端的當前狀態,這應該說是MemcachedFeature設定,用戶不必太多關心或者自己管理數據的淘汰更新工作,當然是否適合你的應用,取決于具體的需求,它也可能成為你需要精確自行控制Cache生命周期的一個障礙

?

Memcached也不做數據的持久化工作,但是有許多基于memcached協議的項目實現了數據的持久化,例如memcacheDB使用BerkeleyDB進行數據存儲,但本質上它已經不是一個Cache Server,而只是一個兼容Memcached的協議key-valueData Store

?

Redis可以以master-slave的方式配置服務器,Slave節點對數據進行replica備份,Slave節點也可以充當Read only的節點分擔數據讀取的工作

?

Redis內建支持兩種持久化方案,snapshot快照和AOF?增量Log方式。快照顧名思義就是隔一段時間將完整的數據Dump下來存儲在文件中。AOF增量Log則是記錄對數據的修改操作(實際上記錄的就是每個對數據產生修改的命令本身),兩種方案可以并存,也各有優缺點,具體參見http://redis.io/topics/persistence

?

以上Redis的數據備份持久化方案等,如果不需要,為了提高性能,也完全可以Disable

?

?

性能

?

性能方面,兩者都有一些自己考慮和實現

?

Memcached

?

memcached自身并不主動定期檢查和標記哪些數據需要被淘汰,只有當再次讀取相關數據時才檢查時間戳,或者當內存不夠使用需要主動淘汰數據時進一步檢查LRU數據

?

?

Redis

?

Redis為了減少大量小數據CMD操作的網絡通訊時間開銷 RTT (Round Trip Time),支持pipelinescript技術

?

  • 所謂的pipeline就是支持在一次通訊中,發送多個命令給服務器批量執行,帶來的代價是服務器端需要更多的內存來緩存查詢結果。
  • Redis內嵌了LUA解析器,可以執行lua?腳本,腳本可以通過eval等命令直接執行,也可以使用script load等方式上傳到服務器端的script cache中重復使用

?

這兩種方式都可以有效地減少網絡通訊開銷,增加數據吞吐率

?

對于KV的操作,MemcachedRedis都支持MultipleGetSet命令(MemcachedMultiple Set命令貌似只在二進制的協議中支持),這同樣有利于性能的提升

?

實際性能方面,網上有很多測試比較,給出的結果各不相同,這無疑和各種測試的測試用例,測試環境,和測試時具體使用的客戶端Library實現有關。但是總體看下來,比較靠譜的結論是在kv類操作上,兩者的性能接近,Memcached的結構更加簡單,理論上應該會略微快一些。

?

?

集群

?

memcached的服務器端互相完全獨立,客戶端通常通過對鍵值應用Hash算法決定數據的分區,為了減少服務器的增減對Hash結果的影響,導致大面積的緩存失效,多數客戶端實現了一致性hash算法

?

Redis計劃在服務器端內建對集群的支持,但是目前代碼還處于alpha階段(貌似已經Design了兩三年了?)在此之前,同樣可以認為每個Redis服務器實例相互之間是完全獨立的,需要依靠客戶端處理分區算法和可用服務器列表管理的工作。

?


?

Redis官方推薦的用于Sharding的客戶端程序庫是Twitter的開源項目?Twemproxy,?Twemproxy同時支持MemcachedRedis的文本通訊協議。

?

需要注意的是,Redis的許多命令在集群環境下是不能正確運行的,例如set的交集,以及跨節點的事務操作等等,因為目前的Redis集群設計,根本目標也就是服務器之間互相匯報一下存活狀態,以及對數據做榮譽備份平衡負載等而已,本質上對數據的跨節點操作并不提供任何額外支持,所以在數據服務的層面上來說,各個服務器依舊是完全獨立的。

?

這些操作如果一定要實現,當然可以通過客戶端代碼來實現(效率有多高且不說),類似的問題memcached集群當然也會遇上,但是原本memcached就不支持復雜的操作和數據類型,許多運算邏輯原本就是由客戶端代碼或應用程序自己處理的。

?

?

MR類批處理應用

?

提供指定范圍的遍歷操作,是支持類似MapReduce這樣的批處理應用邏輯的關鍵之一,但是要在基于hash方式存儲的數據結構的基礎上提供這樣的支持并不容易(或者說要實現高效的范圍或遍歷操作并不容易)

?

Redis支持Scan操作用于遍歷數據集,這一操作基于其內部數據結構及實現的限制,可以保證在Scan開始時的所有數據都能被獲取到,但是不能保證不返回重復的數據,這需要由客戶端來檢查,或者客戶端對此無所謂。Scan操作還支持Match條件用來過濾鍵值,雖然存在一定的局限性,例如match條件的比較是在獲取數據之后再執行的,效率是一個問題,更明顯的問題是不能保證每次scaniterate過程都能返回同樣數量的有效數據。

?

對于范圍操作,RedisOrdered Set支持在插入時指定數據的分數(Score)用于排序,而后支持在指定Score范圍內的各種操作,雖然由于不支持基于字符串的或自定義的基準的Range操作,這樣的范圍操作應用起來有很大的局限性(或者說需要滿足特定的應用模式),但是還是比沒有好了

?

Memcached核心協議本身不支持任何范圍類的操作,也沒有對遍歷操作的支持,甚至不存在官方合法的列舉所有Key的操作,這當然很大程度上源于其設計思想和精簡的架構

?

不過還是有一些兼容memcached協議的服務器實現了范圍類操作,具體格式可以參考?https://code.google.com/p/memcached/wiki/RangeOps?所建議的標準

?

此外RedisHashes數據結構,在一定程度上可以滿足獲取特定子集數據的應用邏輯需求。

?

綜上來說,如果要實現類似HBase支持的scan操作,不論是Redis還是memcached都無法做到,但是對于Redis來說,能否用于批處理類應用,不能一概而論,取決于具體的數據的格式邏輯和使用方式。通過適當的調整應用程序使用數據的方式,還是有可能在一定程度上實現對MR類批處理,或范圍查詢類應用邏輯的支持的。而對于鍵值分布在一個較大的連續空間,數量不確定,同時又無法很好的映射為數值進而使用ordered set來處理的這樣一些數據結構,應該還是很難高效的分區遍歷的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388113.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388113.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388113.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第4章 springboot熱部署 4-1 SpringBoot 使用devtools進行熱部署

/imooc-springboot-starter/src/main/resources/application.properties #關閉緩存, 即時刷新 #spring.freemarker.cachefalse spring.thymeleaf.cachetrue#熱部署生效 spring.devtools.restart.enabledtrue #設置重啟的目錄,添加那個目錄的文件需要restart spring.devtools.r…

border-radius 漲知識的寫法

<div idapp></div>復制代碼#app{width:100%;height:80px;background:pink;border-radius:75%/20% 20% 0 0;}復制代碼僅供自己總結記憶轉載于:https://juejin.im/post/5c80afd66fb9a049f81a1217

ibm python db_使用IBM HR Analytics數據集中的示例的Python獨立性卡方檢驗

ibm python dbSuppose you are exploring a dataset and you want to examine if two categorical variables are dependent on each other.假設您正在探索一個數據集&#xff0c;并且想要檢查兩個分類變量是否相互依賴。 The motivation could be a better understanding of …

Oracle優化檢查表

分類檢查項目相關文件或結果狀態備注日志及文件Oracle Alert 日志bdump/udump下是否存在明顯的報警listener相關日志SQL* Net日志參數/參數文件listener.ora/tnsnames.ora操作系統操作系統版本檢查操作系統補丁節點名操作系統vmstat狀態操作系統I/O狀態操作系統進程情況操作系統…

spring分布式事務學習筆記(2)

此文已由作者夏昀授權網易云社區發布。歡迎訪問網易云社區&#xff0c;了解更多網易技術產品運營經驗。Model類如下&#xff1a;package com.xy.model1 package com.xy.model;2 3 /**4 * Created by helloworld on 2015/1/30.5 */6 public class NameQa {7 private long …

sql 左聯接 全聯接_通過了解自我聯接將您SQL技能提升到一個新的水平

sql 左聯接 全聯接The last couple of blogs that I have written have been great for beginners ( Data Concepts Without Learning To Code or Developing A Data Scientist’s Mindset). But, I would really like to push myself to create content for other members of …

如何查看linux中文件打開情況

如何查看linux中文件打開情況 前言 我們都知道&#xff0c;在linux下&#xff0c;“一切皆文件”&#xff0c;因此有時候查看文件的打開情況&#xff0c;就顯得格外重要&#xff0c;而這里有一個命令能夠在這件事上很好的幫助我們-它就是lsof。 linux下有哪些文件 在介紹lsof命…

hadoop windows

1、安裝JDK1.6或更高版本 官網下載JDK&#xff0c;安裝時注意&#xff0c;最好不要安裝到帶有空格的路徑名下&#xff0c;例如:Programe Files&#xff0c;否則在配置Hadoop的配置文件時會找不到JDK&#xff08;按相關說法&#xff0c;配置文件中的路徑加引號即可解決&#xff…

Ocelot中文文檔入門

入門 Ocelot僅適用于.NET Core&#xff0c;目前是根據netstandard2.0構建的&#xff0c;如果Ocelot適合您&#xff0c;這個文檔可能會有用。 .NET Core 2.1 安裝NuGet包 使用nuget安裝Ocelot及其依賴項。 您需要創建一個netstandard2.0項目并將其打包到其中。 然后按照下面的“…

科學價值 社交關系 大數據_服務的價值:數據科學和用戶體驗研究美好生活

科學價值 社交關系 大數據A crucial part of building a product is understanding exactly how it provides your customers with value. Understanding this is understanding how you fit into the lives of your customers, and should be central to how you build on wha…

在Ubuntu下創建hadoop組和hadoop用戶

一、在Ubuntu下創建hadoop組和hadoop用戶 增加hadoop用戶組&#xff0c;同時在該組里增加hadoop用戶&#xff0c;后續在涉及到hadoop操作時&#xff0c;我們使用該用戶。 1、創建hadoop用戶組 2、創建hadoop用戶 sudo adduser -ingroup hadoop hadoop 回車后會提示輸入新的UNIX…

day06 hashlib模塊

1.hashlib模塊 import hashlib# password123456# print( password.encode()) #加密前先轉成二進制# mhashlib.md5(password.encode())# print(dir(m)) #查詢m的所有方法## print(m.hexdigest()) #使用hexdigest()方法加密&#xff0c;md5加密之后是不可逆&#xff0c;不可以解…

vs azure web_在Azure中遷移和自動化Chrome Web爬網程序的指南。

vs azure webWebscraping as a required skill for many data-science related jobs is becoming increasingly desirable as more companies slowly migrate their processes to the cloud.隨著越來越多的公司將其流程緩慢遷移到云中&#xff0c;將Web爬網作為許多與數據科學相…

hadoop eclipse windows

首先說一下本人的環境: Windows7 64位系統 Spring Tool Suite Version: 3.4.0.RELEASE Hadoop2.6.0 一&#xff0e;簡介 Hadoop2.x之后沒有Eclipse插件工具&#xff0c;我們就不能在Eclipse上調試代碼&#xff0c;我們要把寫好的java代碼的MapReduce打包成jar然后在Linux上運…

同步函數死鎖現象

多線程&#xff1a;一個進程中有多個線程可以同時執行任務 多線程的好處&#xff1a; 1、解決一個進程中可以同時執行多個任務的問題。 2、提高了資源利用率 多線程的弊端&#xff1a; 1、增加了CPU的負擔 2、降低了一個進程中線程的執行概率 3、出現了線程安全問題 4、會引發死…

netstat 在windows下和Linux下查看網絡連接和端口占用

假設忽然起個服務&#xff0c;告訴我8080端口被占用了&#xff0c;OK&#xff0c;我要去看一下是什么服務正在占用著&#xff0c;能不能殺 先假設我是在Windows下&#xff1a; 第一列&#xff1a; Proto 協議 第二列&#xff1a; 本地地址【ip端口】 第三列&#xff1a;遠程地址…

selenium 解析網頁_用Selenium進行網頁搜刮

selenium 解析網頁網頁抓取系列 (WEB SCRAPING SERIES) 總覽 (Overview) Selenium is a portable framework for testing web applications. It is open-source software released under the Apache License 2.0 that runs on Windows, Linux and macOS. Despite serving its m…

表的設計與優化

單表設計與優化 1&#xff09;設計規范化表&#xff0c;消除數據冗余&#xff08;以使用正確字段類型最明顯&#xff09;&#xff1a; 數據庫范式是確保數據庫結構合理&#xff0c;滿足各種查詢需要、避免數據庫操作異常的數據庫設計方式。滿足范式要求的表&#xff0c;稱為規范…

代理ARP協議(Proxy ARP)

代理ARP&#xff08;Proxy-arp&#xff09;的原理就是當出現跨網段的ARP請求時&#xff0c;路由器將自己的MAC返回給發送ARP廣播請求發送者&#xff0c;實現MAC地址代理&#xff08;善意的欺騙&#xff09;&#xff0c;最終使得主機能夠通信。 圖中R1和R3處于不同的局域網&…

hive 導入hdfs數據_將數據加載或導入運行在基于HDFS的數據湖之上的Hive表中的另一種方法。

hive 導入hdfs數據Preceding pen down the article, might want to stretch out appreciation to all the wellbeing teams beginning from cleaning/sterile group to Nurses, Doctors and other who are consistently battling to spare the mankind from continuous Covid-1…