大家好,我是IT修真院深圳分院java第4期學(xué)員,一枚正直善良的java程序員。今天給大家分享一下,修真院官網(wǎng)java任務(wù)六中關(guān)于memcache的知識(shí),以及memcache的使用。
1.背景介紹
Memcached是一種基于內(nèi)存的key-value存儲(chǔ),用來(lái)存儲(chǔ)小塊的任意數(shù)據(jù)(字符串、對(duì)象)。這些數(shù)據(jù)可以是數(shù)據(jù)庫(kù)調(diào)用、API調(diào)用或者是頁(yè)面渲染的結(jié)果。
Memcached簡(jiǎn)潔而強(qiáng)大。它的簡(jiǎn)潔設(shè)計(jì)便于快速開發(fā),減輕開發(fā)難度,解決了大數(shù)據(jù)量緩存的很多問(wèn)題。它的API兼容大部分流行的開發(fā)語(yǔ)言。
本質(zhì)上,它是一個(gè)簡(jiǎn)潔的key-value存儲(chǔ)系統(tǒng)。
一般的使用目的是,通過(guò)緩存數(shù)據(jù)庫(kù)查詢結(jié)果,減少數(shù)據(jù)庫(kù)訪問(wèn)次數(shù),以提高動(dòng)態(tài)Web應(yīng)用的速度、提高可擴(kuò)展性。
2.知識(shí)剖析
為什么會(huì)有Memcache和memcached兩種名稱?
其實(shí)Memcache是這個(gè)項(xiàng)目的名稱,而memcached是它服務(wù)器端的主程序文件名。
memcached運(yùn)行:
啟動(dòng)選項(xiàng):
d是啟動(dòng)一個(gè)守護(hù)進(jìn)程
m是分配給Memcache使用的內(nèi)存數(shù)量,單位是MB
u是運(yùn)行Memcache的用戶
l是監(jiān)聽的服務(wù)器IP地址,可以有多個(gè)地址
p是設(shè)置Memcache監(jiān)聽的端口,,最好是1024以上的端口
c是最大運(yùn)行的并發(fā)連接數(shù),默認(rèn)是1024
P是設(shè)置保存Memcache的pid文件
java客戶端的實(shí)現(xiàn):XMemcached
XMemcached是一個(gè)新java memcached client。
XMemcached是基于java nio的客戶端,java nio相比于傳統(tǒng)阻塞io模型來(lái)說(shuō),有效率高(特別在高并發(fā)下)和
資源耗費(fèi)相對(duì)較少的優(yōu)點(diǎn)。傳統(tǒng)阻塞IO為了提高效率,需要?jiǎng)?chuàng)建一定數(shù)量的連接形成連接池,而nio僅需要一
個(gè)連接即可(當(dāng)然,nio也是可以做池化處理),相對(duì)來(lái)說(shuō)減少了線程創(chuàng)建和切換的開銷,這一點(diǎn)在高并發(fā)下特別明顯。
XMemcached的使用:
1)導(dǎo)入xmemcached依賴
2)創(chuàng)建MemcachedClientBuilder,然后builder一個(gè)MemcachedClient
Memcached 存儲(chǔ)命令:
Memcached set 命令:用于將 value(數(shù)據(jù)值) 存儲(chǔ)在指定的 key(鍵) 中。
如果set的key已經(jīng)存在,該命令可以更新該key所對(duì)應(yīng)的原來(lái)的數(shù)據(jù),也就是實(shí)現(xiàn)更新的作用。
Memcached add 命令:Memcached add 命令用于將 value(數(shù)據(jù)值) 存儲(chǔ)在指定的 key(鍵) 中。
如果 add 的 key 已經(jīng)存在,則不會(huì)更新數(shù)據(jù)(過(guò)期的 key 會(huì)更新),之前的值將仍然保持相同。
Memcached replace 命令:用于替換已存在的 key(鍵) 的 value(數(shù)據(jù)值)。
如果 key 不存在,則替換失敗
Memcached append 命令:用于向已存在 key(鍵) 的 value(數(shù)據(jù)值) 后面追加數(shù)據(jù) 。
Memcached prepend 命令:用于向已存在 key(鍵) 的 value(數(shù)據(jù)值) 前面追加數(shù)據(jù) 。
Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令用于執(zhí)行一個(gè)"檢查并設(shè)置"的操作
它僅在當(dāng)前客戶端最后一次取值后,該key 對(duì)應(yīng)的值沒(méi)有被其他客戶端修改的情況下, 才能夠?qū)⒅祵懭搿?/p>
檢查是通過(guò)cas_token參數(shù)進(jìn)行的, 這個(gè)參數(shù)是Memcach指定給已經(jīng)存在的元素的一個(gè)唯一的64位值。
Memcached 查找命令:
Memcached get 命令:獲取存儲(chǔ)在 key(鍵) 中的 value(數(shù)據(jù)值) ,如果 key 不存在,則返回空。
Memcached gets 命令:獲取帶有 CAS 令牌存 的 value(數(shù)據(jù)值) ,如果 key 不存在,則返回空。
Memcached delete 命令:用于刪除已存在的 key(鍵)。
Memcached incr 與 decr 命令用于對(duì)已存在的 key(鍵) 的數(shù)字值進(jìn)行自增或自減操作。
incr 與 decr 命令操作的數(shù)據(jù)必須是十進(jìn)制的32位無(wú)符號(hào)整數(shù)。
Memcached 統(tǒng)計(jì)命令:
Memcached stats 命令:用于返回統(tǒng)計(jì)信息例如 PID(進(jìn)程號(hào))、版本號(hào)、連接數(shù)等。
Memcached stats items 命令:用于顯示各個(gè) slab 中 item 的數(shù)目和存儲(chǔ)時(shí)長(zhǎng)(最后一次訪問(wèn)距離現(xiàn)在的秒數(shù))。
Memcached stats slabs 命令:用于顯示各個(gè)slab的信息,包括chunk的大小、數(shù)目、使用情況等。
Memcached stats sizes 命令用于顯示所有item的大小和個(gè)數(shù)。
該信息返回兩列,第一列是 item 的大小,第二列是 item 的個(gè)數(shù)。
Memcached flushAll 命令:用于用于清理緩存中的所有 key=>value(鍵=>值) 對(duì)。
3.常見問(wèn)題
Memcached本身并沒(méi)有提供迭代所有key的方法,如何查看memcache中所有的key?
4.解決方案
想迭代所有的key,你只需要獲取一個(gè)KeyIterator,然后遍歷KeyIterator即可。
5.編碼實(shí)戰(zhàn)
。。。
6.擴(kuò)展思考
為什么使用cas協(xié)議?
當(dāng)我們的應(yīng)用是分布式的,無(wú)狀態(tài)的應(yīng)用服務(wù)器通過(guò)負(fù)載均衡,部署到了多臺(tái)。
如果不采用CAS,則有如下的情景:
第一步,A取出數(shù)據(jù)對(duì)象X;
第二步,B取出數(shù)據(jù)對(duì)象X;
第三步,B修改數(shù)據(jù)對(duì)象X,并將其放入緩存;
第四步,A修改數(shù)據(jù)對(duì)象X,并將其放入緩存。
第四步和第三步的存儲(chǔ)數(shù)據(jù)就產(chǎn)生了沖突。所以需要cas操作命令:
cas操作必須先要通過(guò),gets名利獲得cas令牌,然后把令牌帶入cas命令才可以修改數(shù)據(jù)。
7.參考文獻(xiàn)
參考一:Xmemcached 中文用戶指南
參考二:memcached 菜鳥教程
8.更多討論
1)不同服務(wù)器間的不同memecache的數(shù)據(jù)可以共享嗎?
沒(méi)有共享的必要。
2)memcache分布式算法有幾種?
我所知道的有:余數(shù)哈希,一致性哈希,但是現(xiàn)在基本都用一致性哈希。
3)電腦關(guān)機(jī),memcache數(shù)據(jù)還存在嗎?
這要看你的memcache是安裝在什么地方,要是裝在本機(jī),那么關(guān)機(jī)之后數(shù)據(jù)就沒(méi)有了,我是裝在服務(wù)器,我的服務(wù)器一直開機(jī),所以,我的電腦關(guān)機(jī)對(duì)我的memecache數(shù)據(jù)沒(méi)有影響。
4)memcache節(jié)點(diǎn)是什么?
考量 Hash 算法的另一個(gè)指標(biāo)是平衡性 (Balance) ,定義如下:
平衡性:平衡性是指哈希的結(jié)果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。
hash算法并不是保證絕對(duì)的平衡,如果 cache 較少的話,對(duì)象并不能被均勻的映射到 cache 上,比如在上面的例子中,僅部署 cache A 和 cache C 的情況下,在4個(gè)對(duì)象中, cache A 僅存儲(chǔ)了 object1 ,而 cache C 則存儲(chǔ)了 object2 、 object3 和 object4 ;分布是很不均衡的。
為了解決這種情況, consistent hashing 引入了“虛擬節(jié)點(diǎn)”的概念,它可以如下定義:
“虛擬節(jié)點(diǎn)”( virtual node )是實(shí)際節(jié)點(diǎn)在 hash 空間的復(fù)制品( replica ),一實(shí)際個(gè)節(jié)點(diǎn)對(duì)應(yīng)了若干個(gè)“虛擬節(jié)點(diǎn)”,這個(gè)對(duì)應(yīng)個(gè)數(shù)也成為“復(fù)制個(gè)數(shù)”,“虛擬節(jié)點(diǎn)”在 hash 空間中以 hash 值排列。
5)memcache存儲(chǔ)的方式:
它是key-value形式存儲(chǔ)的。
PPT鏈接:戳這里
騰訊視頻:戳這里
今天的分享就到這里啦,歡迎大家點(diǎn)贊、轉(zhuǎn)發(fā)、留言、拍磚~
技能樹。IT修真學(xué)院
“我們相信人人都可以成為一個(gè)工程師,現(xiàn)在開始,找個(gè)師兄,帶你入門,掌控自己學(xué)習(xí)的節(jié)奏,學(xué)習(xí)的路上不再迷?!?。
這里是技能樹.IT修真院,成千上萬(wàn)的師兄在這里找到了自己的學(xué)習(xí)路線,學(xué)習(xí)透明化,成長(zhǎng)可見化,師兄1對(duì)1免費(fèi)指導(dǎo)??靵?lái)與我一起學(xué)習(xí)吧~