摘要:五數(shù)據(jù)使用來存儲的效率是最高的。通過以上的策略數(shù)據(jù)庫的壓力將會被大大減輕。后續(xù)本專題也會討論一下的分布式算法提高其命中率應(yīng)用場景二秒殺功能。其實,本場景嚴格的說應(yīng)該也屬于場景一,多帶帶拎出來說是由于其廣泛的應(yīng)用性。
簡介
Memcached是一個高性能的分布式的內(nèi)存對象緩存系統(tǒng),目前全世界不少人使用這個緩存項目來構(gòu)建自己大負載的網(wǎng)站,來分擔(dān)數(shù)據(jù)庫的壓力,通過在內(nèi)存里維護一個統(tǒng)一的巨大的hash表,它能夠用來存儲各種格式的數(shù)據(jù),包括圖像、視頻、文件以及數(shù)據(jù)庫檢索的結(jié)果等。簡單的說就是將數(shù)據(jù)調(diào)用到內(nèi)存中,然后從內(nèi)存中讀取,從而大大提高讀取速度。
MemCache的工作流程如下:先檢查客戶端的請求數(shù)據(jù)是否在memcached中,如有,直接把請求數(shù)據(jù)返回,不再對數(shù)據(jù)庫進行任何操作;如果請求的數(shù)據(jù)不在memcached中,就去查數(shù)據(jù)庫,把從數(shù)據(jù)庫中獲取的數(shù)據(jù)返回給客戶端,同時把數(shù)據(jù)緩存一份到memcached中(memcached客戶端不負責(zé),需要程序明確實現(xiàn));每次更新數(shù)據(jù)庫的同時更新memcached中的數(shù)據(jù),保證一致性;當(dāng)分配給memcached內(nèi)存空間用完之后,會使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效數(shù)據(jù)首先被替換,然后再替換掉最近未使用的數(shù)據(jù)。
Memcached是以守護程序(監(jiān)聽)方式運行于一個或多個服務(wù)器中,隨時會接收客戶端的連接和操作。默認監(jiān)聽端口為11211。
在 Memcached中可以保存的item數(shù)據(jù)量是沒有限制的,只要內(nèi)存足夠 。
Memcached單進程在32位系統(tǒng)中最大使用內(nèi)存為2G,若在64位系統(tǒng)則沒有限制,這是由于32位系統(tǒng)限制單進程最多可使用2G內(nèi)存,要使用更多內(nèi)存,可以分多個端口開啟多個Memcached進程,最大30天的數(shù)據(jù)過期時間,設(shè)置為永久的也會在這個時間過期,常量REALTIME_MAXDELTA 60*60*24*30控制。
最大鍵長為250字節(jié),大于該長度無法存儲,常量KEY_MAX_LENGTH 250控制.
單個item最大數(shù)據(jù)是1MB,超過1MB數(shù)據(jù)不予存儲,常量POWER_BLOCK 1048576進行控制.但一般都是存儲一些文本,如新聞列表等等,這個值足夠了
memcached 用 slab allocator 機制來管理內(nèi)存(在本專題的后續(xù)文章中會專門說這個內(nèi)存機制的).它是默認的slab大小最大同時連接數(shù)是200,通過 conn_init()中的freetotal進行控制,最大軟連接數(shù)是1024,通過
settings.maxconns=1024 進行控制跟空間占用相關(guān)的參數(shù):settings.factor=1.25, settings.chunk_size=48, 影響slab的數(shù)據(jù)占用和步進方式。
memcached是一種無阻塞的socket通信方式服務(wù),基于libevent庫,由于無阻塞通信,對內(nèi)存讀寫速度非常之快。
memcached分服務(wù)器端和客戶端,可以配置多個服務(wù)器端和客戶端,應(yīng)用于分布式的服務(wù)非常廣泛。
memcached作為小規(guī)模的數(shù)據(jù)分布式平臺是十分有效果的。
memcached是鍵值一一對應(yīng),key默認最大不能超過128個字節(jié),value默認大小是1M,也就是一個slabs,如果要存2M的值(連續(xù)的),不能用兩個slabs,因為兩個slabs不是連續(xù)的,無法在內(nèi)存中 存儲,故需要修改slabs的大小,多個key和value進行存儲時,即使這個slabs沒有利用完,那么也不會存放別的數(shù)據(jù)。
memcached已經(jīng)可以支持C/C++、Perl、PHP、Python、Ruby、Java、C#、Postgres、Chicken Scheme、Lua、MySQL和Protocol等語言客戶端。
應(yīng)用場景使用Memcache的網(wǎng)站一般流量都是比較大的,為了緩解數(shù)據(jù)庫的壓力,讓Memcache作為一個緩存區(qū)域,把部分信息保存在內(nèi)存中,在前端能夠迅速的進行存取。并且通過memcache的時效expire特性,還可以更簡單的完成一些功能,我總結(jié)如下:
應(yīng)用場景一: 緩解數(shù)據(jù)庫壓力,提高交互速度。
在開發(fā)中不管是基于框架的面向?qū)ο箝_發(fā),還是面向過程開發(fā),數(shù)據(jù)模型一定是要經(jīng)過封裝后再使用的,這樣我們就可以對程序做統(tǒng)一處理,比如在程序開發(fā)初期,我們沒用memcache或者redis來做緩存,我們把從數(shù)據(jù)庫里面取數(shù)據(jù)統(tǒng)統(tǒng)使用query($sql)方法來讀數(shù)據(jù);
/** * 數(shù)據(jù)庫查詢偽代碼,僅僅是提供一個思路 * @param string $sql sql語句,比如select * form sc_users; * @param int $expire 緩存失效時間 * @param int $type 1直接從數(shù)據(jù)庫里面讀取,0先走緩存,再走數(shù)據(jù)庫 * @return {[type]} [description] */ public function query($sql,$expire=300,$type=0){ if($type == 1){ return "直接從數(shù)據(jù)庫里面取出來"; } $key = md5($sql); //以md5后的sql作為key $result = $this -> mem -> get($key); //如果緩存里面沒有 if(empty($result)){ $data = "從數(shù)據(jù)庫里面取到數(shù)據(jù)"; //放入緩存 $this -> mem -> add($key,$data,MEMCACHE_COMPRESSED,$expire); //$data是個數(shù)組,所以要序列化壓縮一下 return $data; } //如果有的話就直接返回; return $result; }
它的一個總原則是將經(jīng)常需要從數(shù)據(jù)庫讀取的數(shù)據(jù)緩存在memcached中。這些數(shù)據(jù)也分為幾類:
一、經(jīng)常被讀取并且實時性要求不強可以等到自動過期的數(shù)據(jù)。例如網(wǎng)站首頁最新文章列表、某某排行等數(shù)據(jù)。也就是雖然新數(shù)據(jù)產(chǎn)生了,但對用戶體驗不會產(chǎn)生任何影響的場景。
這類數(shù)據(jù)就使用典型的緩存策略,設(shè)置一過合理的過期時間,當(dāng)數(shù)據(jù)過期以后再從數(shù)據(jù)庫中讀取。當(dāng)然你得制定一個緩存清除策略,便于編輯或者其它人員能馬上看到效果。
二、經(jīng)常被讀取并且實時性要求強的數(shù)據(jù)。比如用戶的好友列表,用戶文章列表,用戶閱讀記錄等。
這類數(shù)據(jù)首先被載入到memcached中,當(dāng)發(fā)生更改(添加、修改、刪除)時就清除緩存。在緩存的時候,我將查詢的SQL語句md5()得到它的 hash值作為key,結(jié)果數(shù)組作為值寫入memcached,并且將該SQL涉及的table_name以及hash值配對存入memcached中。 當(dāng)更改了這個表時,我就將與此表相配對的key的緩存全部刪除。
三、統(tǒng)計類緩存,比如文章瀏覽數(shù)、網(wǎng)站PV等
此類緩存是將在數(shù)據(jù)庫的中來累加的數(shù)據(jù)放在memcached來累加。獲取也通過memcached來獲取。但這樣就產(chǎn)生了一個問題,如果memcached服務(wù)器down 掉的話這些數(shù)據(jù)就有可能丟失,所以一般使用memcached的永固性存儲,這方面新浪使用memcachedb。
四、活躍用戶的基本信息或者某篇熱門文章。
此類數(shù)據(jù)的一個特點就是數(shù)據(jù)都是一行,也就是一個一維數(shù)組,當(dāng)數(shù)據(jù)被update時(比如修改昵稱、文章的評論數(shù)),在更改數(shù)據(jù)庫數(shù)據(jù)的同時,使用Memcache::replace替換掉緩存里的數(shù)據(jù)。這樣就有效了避免了再次查詢數(shù)據(jù)庫。
五、session數(shù)據(jù)
使用memcached來存儲session的效率是最高的。memcached本身也是非常穩(wěn)定的,不太用擔(dān)心它會突然down掉引起session數(shù)據(jù)的丟失,即使丟失就重新登錄了,也沒啥。
六、冷熱數(shù)據(jù)交互
在做高訪問量的sns應(yīng)用,比如貼吧和論壇,由于其數(shù)據(jù)量大,往往采用了分表分庫的策略,但真正的熱數(shù)據(jù)僅僅是前兩三頁的100條數(shù)據(jù),這時,我們就可以把這100條數(shù)據(jù),在寫進數(shù)據(jù)庫之后,同時作為memcache的緩存熱數(shù)據(jù)來使用。
通過以上的策略數(shù)據(jù)庫的壓力將會被大大減輕。檢驗?zāi)闶褂胢emcached是否得當(dāng)?shù)姆椒ㄊ遣榭磎emcached的命中率。有些策略好的網(wǎng)站的命中率可以到達到90%以上。后續(xù)本專題也會討論一下memcache的分布式算法,提高其命中率;
應(yīng)用場景二: 秒殺功能。
其實,本場景嚴格的說應(yīng)該也屬于場景一,多帶帶拎出來說是由于其廣泛的應(yīng)用性。
一個人下單,要牽涉數(shù)據(jù)庫讀取,寫入訂單,更改庫存,及事務(wù)要求, 對于傳統(tǒng)型數(shù)據(jù)庫來說,壓力是巨大的。
可以利用 memcached 的 incr/decr 功能, 在內(nèi)存存儲 count 庫存量, 秒殺 1000 臺每人搶單主要在內(nèi)存操作,速度非常快,搶到 count < =1000 的號人,得一個訂單號,這時再去另一個頁面慢慢支付。
應(yīng)用場景三:中繼 MySQL 主從延遲數(shù)據(jù)
MySQL 在做 replication 時,主從復(fù)制之間必然要經(jīng)歷一個復(fù)制過程,即主從延遲的時間.
尤其是主從服務(wù)器處于異地機房時,這種情況更加明顯.
比如facebook 官方的一篇技術(shù)文章,其加州的主數(shù)據(jù)中心到弗吉尼亞州的主從同步延期達到70ms;
考慮如下場景:
①: 用戶 U 購買電子書 B, insert into Master (U,B);
②: 用戶 U 觀看電子書 B, select 購買記錄[user=’A’,book=’B’] from Slave.
③: 由于主從延遲,第②步中無記錄,用戶無權(quán)觀看該書.
這時,可以利用 memached 在 master 與 slave 之間做過渡(如下圖):
①: 用戶 U 購買電子書 B, memcached->add(‘U:B’,true)
②: 主數(shù)據(jù)庫 insert into Master (U,B);
③: 用戶 U 觀看電子書 B, select 購買記錄[user=’U’,book=’B’] from Slave.
如果沒查詢到,則 memcached->get(‘U:B’),查到則說明已購買但 Slave 延遲.
④: 由于主從延遲,第②步中無記錄,用戶無權(quán)觀看該書.
緩存對象的大小大于1MB
Memcached本身就不是為了處理龐大的多媒體(large media)和巨大的二進制塊(streaming huge blobs)而設(shè)計的。
key的長度大于250字符(所以我們把一些key先md5再存儲)。
應(yīng)用運行在不安全的環(huán)境中Memcached為提供任何安全策略,僅僅通過telnet就可以訪問到memcached。如果應(yīng)用運行在共享的系統(tǒng)上,需要著重考慮安全問題。
業(yè)務(wù)本身需要的是持久化數(shù)據(jù)。
Memcache的安全只說一下思路:
把memcached的端口給禁止掉(這時只能本ip訪問),讓其他ip的使用者只能通過對外開放的80端口訪問PHP腳本文件,再通過PHP的腳本文件去訪問memcache;
iptables -a input -p 協(xié)議 -s 可以訪問ip -dport 端口 -j ACCEPT擴展閱讀
Memcache應(yīng)用場景介紹,說明[zz]:
http://www.cnblogs.com/literoad/archive/2012/12/23/2830178.html
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/61690.html
安裝 在windows上安裝 略(都玩到緩存的程度了,就沒必要在windows上搗弄了) 給個參考: http://blog.csdn.net/yuhui_fish/article/details/7762299 在Linux上安裝 memcached 依賴于 libevent 庫,因此我們需要先安裝 libevent.分別到 libevent.org 和 memcached.org 下載最新的 ...
摘要:自己整理了一篇不同等級面試都問什么的文章,關(guān)注公眾號琉憶編程庫,回復(fù)等級,我發(fā)給你。 你好,是我琉憶。今天是周五了,再上一天班就周末了,提前祝大家周末愉快。嘿嘿。這篇文章是本周Memcache和Redis內(nèi)存數(shù)據(jù)庫常考的專題。本周一和周三更新的文章路徑:PHP面試常考內(nèi)容之Memcache和Redis(1)PHP面試常考內(nèi)容之Memcache和Redis(2)本周(2019.2-18至...
摘要:自己整理了一篇不同等級面試都問什么的文章,關(guān)注公眾號琉憶編程庫,回復(fù)等級,我發(fā)給你。 你好,是我琉憶。今天是周五了,再上一天班就周末了,提前祝大家周末愉快。嘿嘿。這篇文章是本周Memcache和Redis內(nèi)存數(shù)據(jù)庫常考的專題。本周一和周三更新的文章路徑:PHP面試常考內(nèi)容之Memcache和Redis(1)PHP面試常考內(nèi)容之Memcache和Redis(2)本周(2019.2-18至...
摘要:以下正文的部分內(nèi)容來自程序員面試筆試寶典書籍,如果轉(zhuǎn)載請保留出處一什么是是一個開源免費高性能的分布式對象緩存系統(tǒng),它基于一個存儲鍵值對的來存儲數(shù)據(jù)到內(nèi)存中。預(yù)告面試常考內(nèi)容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發(fā)布的PHP面試常考內(nèi)容之面向?qū)ο髮n}后,發(fā)布的第二個專題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點為以下幾點,更新時...
摘要:以下正文的部分內(nèi)容來自程序員面試筆試寶典書籍,如果轉(zhuǎn)載請保留出處一什么是是一個開源免費高性能的分布式對象緩存系統(tǒng),它基于一個存儲鍵值對的來存儲數(shù)據(jù)到內(nèi)存中。預(yù)告面試常考內(nèi)容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發(fā)布的PHP面試常考內(nèi)容之面向?qū)ο髮n}后,發(fā)布的第二個專題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點為以下幾點,更新時...
閱讀 3457·2021-11-17 17:00
閱讀 3818·2021-08-09 13:46
閱讀 2866·2019-08-30 15:54
閱讀 627·2019-08-30 13:54
閱讀 2945·2019-08-29 17:13
閱讀 3218·2019-08-29 14:00
閱讀 2975·2019-08-29 11:11
閱讀 1379·2019-08-26 10:15