您好,登錄后才能下訂單哦!
Memcached的原理是什么,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
一、Memcached簡介
memcached是高性能的分布式內(nèi)存緩存服務(wù)器。它通過緩存數(shù)據(jù)庫查詢結(jié)果,減少數(shù)據(jù)庫訪問次數(shù),以提高動態(tài)Web應(yīng)用的速度、提高可擴(kuò)展性。與其類似常見的還有Redis。Memcached基于一個存儲鍵/值(K/V)對的hashmap??蛻舳丝梢杂萌魏握Z言來編寫,并通過memcached協(xié)議與守護(hù)進(jìn)程通信。
memcached的API使用32位元的循環(huán)冗余校驗(yàn)(CRC-32)計算鍵值后,將資料分散在不同的機(jī)器上。當(dāng)表格滿了以后,接下來新增的資料會以LRU機(jī)制替換掉。
二、Memcached的分布式算法
1、余數(shù)哈希(余數(shù)計算分散):
原理:根據(jù)服務(wù)器臺數(shù)的余數(shù)進(jìn)行分散:先求得鍵(key)的整數(shù)哈希值( int hashCode ),通過Hash函數(shù)把key轉(zhuǎn)化成整數(shù)后,再用這個哈希值除以服務(wù)器臺數(shù),根據(jù)余數(shù)選擇服務(wù)器。
舉例:總共10臺服務(wù)器(編號為0~9),先獲取數(shù)據(jù)的key的整數(shù)哈希值:hashCode=hash(key)=13 ,然后除以服務(wù)器總臺數(shù),mod 10(13%10)=3,即選擇編號為3的服務(wù)器進(jìn)行存儲。
缺點(diǎn):當(dāng)添加或減少服務(wù)器后要進(jìn)行重哈希,這樣會導(dǎo)致原來的服務(wù)器序號變了,則可能出現(xiàn)求得的余數(shù)也改變,導(dǎo)致Memcached命中率下降,導(dǎo)致更多地訪問數(shù)據(jù)庫服務(wù)器去調(diào)數(shù)據(jù),增加了數(shù)據(jù)庫服務(wù)器的負(fù)載。
2、一致性哈希:
原理:
一致性哈希是將整個哈希值空間組織成一個虛擬的圓環(huán),如假設(shè)某哈希函數(shù)H的值空間是0~(2^32 -1)(即哈希值是一個32位的無符號整型)。這個哈希空間為環(huán)。然后讓每臺機(jī)器占一個扇形空間。(一致性哈希方式,使得服務(wù)器保存的哈希值空間是一個范圍,而不是一個特定的余數(shù)系列.所以減少了增刪服務(wù)器后的影響.)
哈??臻g按順時針方向組織。為確定每臺服務(wù)器在空間上的位置,按照服務(wù)器主機(jī)名或者IP地址對每臺服務(wù)器進(jìn)行Hash尋址。然后需要使用hash算法來判斷數(shù)據(jù)應(yīng)該存儲在哪個服務(wù)器:首先,將數(shù)據(jù)根據(jù)key值使用相同的函數(shù)H計算出哈希值h,根據(jù)h確定數(shù)據(jù)在環(huán)上的位置,從此位置延環(huán)順時針向下尋找,遇到的第一個服務(wù)器就是其應(yīng)該存儲的服務(wù)器。
容錯性:對下圖,當(dāng)Server3服務(wù)器故障時,數(shù)據(jù)的存儲指示D發(fā)生了改變,存放在了Server2上邊。系統(tǒng)的存儲數(shù)據(jù)變化最少(因?yàn)槭菙?shù)據(jù)是順時針尋找服務(wù)器存儲,所以D位置數(shù)據(jù)找到的是Server2服務(wù)器)
擴(kuò)展性:假設(shè)增加服務(wù)器Server4,按規(guī)則放在BC中間,那么只是B存儲在Server4上邊了,整體的影響只是發(fā)生在了新增節(jié)點(diǎn)的區(qū)間部分。
三、Memcached的數(shù)據(jù)清除算法
Memcached會啟動LRU(Least Recently Used,最近最少使用)算法淘汰舊的數(shù)據(jù)項。
每個slab會維護(hù)一個隊列,剛插入的數(shù)據(jù)在隊頭,經(jīng)常get的數(shù)據(jù)也會移動到隊頭,這樣較老或者訪問較少的數(shù)據(jù)相對都留在隊尾。該算法從隊尾開始淘汰。當(dāng)slab分配不到足夠的內(nèi)存時,首先會檢查隊尾是否有過期數(shù)據(jù)。如果有的話會直接將其覆蓋為新的對象,如果沒有,會開始淘汰隊尾的對象。
四、工作流程
檢查客戶端的請求數(shù)據(jù)是否在memcached中,若存在則直接把請求數(shù)據(jù)返回,不存在則訪問數(shù)據(jù)庫服務(wù)器進(jìn)行操作;
如果請求的數(shù)據(jù)不在memcached中,就去查數(shù)據(jù)庫,把從數(shù)據(jù)庫中獲取的數(shù)據(jù)返回給客戶端,同時把數(shù)據(jù)緩存一份到memcached中(memcached客戶端不負(fù)責(zé),需要程序明確實(shí)現(xiàn));
每次更新數(shù)據(jù)庫的同時更新memcached中的數(shù)據(jù),保證一致性;當(dāng)分配給memcached內(nèi)存空間用完之后,會使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效數(shù)據(jù)首先被替換,然后再替換掉最近未使用的數(shù)據(jù)。
五、Memcached 和 Redis的區(qū)別?
1、數(shù)據(jù)存儲位置:Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時候可以再次加載進(jìn)行使用。而Memecache把數(shù)據(jù)全部存在內(nèi)存之中;
2、速度上:Redis的速度比memcached快很多;
3、多線程:Memcached支持多線程,而Redis使用單線程的IO復(fù)用模型;
4、支持的數(shù)據(jù)類型:Memcached僅支持簡單的數(shù)據(jù)類型,想要存入復(fù)雜的數(shù)據(jù)類型必須把復(fù)雜的數(shù)據(jù)類型轉(zhuǎn)變成簡單的數(shù)據(jù)類型。Redis不僅僅支持簡單的k/v類型的數(shù)據(jù),同時還提供string(字符串)、list(鏈表)、set(集合)、zset(sortedset --有序集合)和hash(哈希類型)等數(shù)據(jù)結(jié)構(gòu)的存儲。
關(guān)于Memcached的原理是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。