Memcached學習摘要

關鍵字: memcached

轉自:http://blog.csdn.net/starxu85/archive/2008/03/29/2227158.aspx

過期機制: memcached的item過期後並不會有刪除該item的操作,只會在get的時候判斷是否過期。

覆蓋機制: 當memcached滿了的時候,過期的items將會被優先覆蓋,然後是用的最少的items

鎖定方法: memcached並沒有提供鎖定某一個key的方法,可以通過其他方法來實現鎖定。最常用的是用add方法。例如,我們要更新一個key,可以先王memcached裏面add一個叫lock_key的鍵值,如果add成功,就說明鎖定上了,否則,說明memcached裏面已經有lock_key這個鍵值,有其他程序在鎖定這個key了,嗯,然後可以等待,或者退出,隨便,嘿嘿,參考 http://www.socialtext.net/memcached/index.cgi?faq#emulating_locking_with_the_add_command

存放數組: 直接把整個數組存放到爲一個key是一個很lame的方法。因爲memcached每一個key有1M大小的硬限制,存放的數據不能超過1M,而且,如果你要刪除數組中的某一個元素,必須把整個數組get回來,刪掉該元素,然後再set該數組,這個操作很浪費流量,也很沒有必要。當然,如果是小數組,直接存放到memcached會比較方便,也就無所謂了。我們下面的方法主要是針對比較大的數組。對於比較大的數組,可以採用以下方法: 1.採用一個key存放數組的key列表,php裏面可以通過array_keys獲取。數組的每一個元素值用一個key存放在memcached中,比如可以用 “數組名_元素key名” 的key值存放。這樣做,有很多好處,例如,要將數組分頁顯示的時候,不用獲取整個數組,只需要獲取要顯示的部分元素;更新數組元素的時候,只需要更新兩個鍵值,就是索引和對應的元素;如果用了分佈式memcached,整個數組的元素會分佈到不同的服務器存放,與整個數組放在一個key值裏面比較,可以大大降低某一臺memcached服務器的流量……更多的好處自己去挖掘吧; 2. 上面這種方法有點很多,缺點就是如果要獲取整個數組,就要像memcached發出很多請求。根據我們需求的不同,還可以提出另一種方法,適用於更新很少而且經常要獲取部分數據的數組,就是將數組分段存放,嗯,例如,array_name_0_500這個key存放的是數組0-500號元素,array_name_501-1000是501-1000號元素,依次類推。這個方法的優點很明顯,用來分頁很贊,確定也很鬱悶,就是插入或者刪除元素的時候,要更新無數的key……

Multi獲取: PHP的memcache:get方法支持傳入array類型的參數,可以一次性獲取多個key值。這樣做的優點是,如果你的數據都存放在一個服務器上面,你獲取這堆數據只需要發一次TCP連接請求,可以省下很多等待建立TCP連接的時間,特別是網絡延時比較大的時候,嗯。

更新機制:嗯,特別請教了HL同學,怎麼處理memcache內容過期的問題。我們使用memcache一般是緩存數據庫的內容,特別是查詢比較慢或者訪問比較頻繁的內容,爲了保證數據的時效性,一方面,我們要有一個主動更新的機制,這個不討論,另一方面,我們需要設置一個memcache的過期時間,當memcache內容過期的時候,會到數據庫去重新獲取內容更新到memcache裏面。如果過期的內容是訪問比較頻繁的內容時,就會存在一個問題,就是過期後,可能會有很多請求試圖到數據庫去獲取數據更新到memcache,數據庫負荷會在一瞬間增大很多。要解決這種情況,就要用到預緩存機制和上面說的鎖定機制,就是要在過期時間前n秒去更新內容,並且只能有一個線程更新memcache的內容,其他線程更新前,如果檢測到鎖,就不更新,直接返回獲取到的內容。

想到在寫……歡迎hl補充

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章