任務(wù)六:memcache的使用

大家好,我是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í)吧~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容