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