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