memcache 缓存的批量删除方案(转)
memcache 默認只支持使用delete(key)和 flush_all,這兩種方法都太極端了,不能滿足用戶的特定需求,如:批量刪除‘aaaaaaaa_’開頭的所有緩存,這個時候該怎么辦?
1 getExtendStats 遍歷所有item,刪除指定的key(不推薦)
?網上有對應的php代碼和perl程序,感興趣的可以看看,在本地測試時可以使用,但是在真是服務器上請不要使用。
?
2?memcache結合DB
方法:每次set緩存時,將key值存入數據庫,在要刪除緩存時查詢數據庫,查詢出對應的信息,在memcache中將其刪除
?缺點:浪費數據褲磁盤
?
3 memcache偽命名空間(推薦)
memcache默認不提供命名空間,但可以設置一個全局變量,來模擬命名空間,代碼如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | ?php? ????//生成一個用來保存 namespace 的 key? ????$ns_key = $memcache->get("foo_namespace_key");? ??????? ????//如果 key 不存在,則創建,默認使用當前的時間戳作為標識 ????if($ns_key===false) $memcache->set("foo_namespace_key",time());? ??????? ????//根據 namespace_key 生成真正的 key,確保是唯一的key值? ????$my_key = "foo_".$ns_key.$otherParms; ?????? ????//然后利用拼接的my_key值設置你需要緩存的各種數據 ????$memcache->set($my_key,$value,false,expire); ????//或者key值獲得以前存儲的緩存 ????$memcaceh->get($my_key); ??????? ??????? ????//需要刪除整個 namespace 里的對象的時候,如:更改數據庫或者刪除某些信息后 ????//將ns_key的值改變,則以后在訪問緩存時,以前時間的將永遠不會別訪問到,以此來實現批量刪除緩存 ?????$memcache->set("foo_namespace_key",time()); ?> |
?
memcache 命令操作
在定位緩存問題測試時,經常需要對memcache的數據進行一些操作,但是其本身沒有自帶的客戶端,所以只能通過telnet來進行操作。
通過telnet連接memcache
telnet 127.0.0.1 11211?
memcache寫入操作
telnet寫入memcache命令格式
command name> key> flags> exptime> bytes>\r\n data block>\r\n參數詳解:
1. command name> 可以是”set”, “add”, “replace”
? ? ?set:key>不存在時添加,key>存在時覆蓋
? ? ?add:key>不存在時添加,key>存在時則會操作失敗
? ? ?replace:key>不存在時添加失敗,key>存在時替換數據
2. key> 保存數據的key
3. flags> 是一個16位的無符號的整數(以十進制的方式表示)。
? ? ?該標志將和需要存儲的數據一起存儲,并在客戶端get數據時返回
? ? ?客戶可以將此標志用做特殊用途,此標志對服務器來說是透明的
4. exptime> 過期的時間
? ? ?0 表示存儲的數據永遠不過期(但可被服務器算法:LRU 等替換)
? ? ?n?非0數字(unix時間),當過期后服務器可以保證用戶得不到該數據(以服務器時間為標準)
5. bytes> 需要存儲的字節數(不包含最后的”\r\n”),當用戶希望存儲空數據時,可以為0
6. 最后客戶端需要加上”\r\n”作為”命令頭”的結束標志
7. data block>
? ? ?緊接著”命令頭”結束之后就要發送數據塊(即希望存儲的數據內容),最后加上”\r\n”作為此次通訊的結束。
?
telnet 響應命令
當以上數據發送結束之后,服務器將返回一個應答,可能有如下情況:
1. STORED:表示存儲成功
2. NOT_STORED: 表示存儲失敗,但是該失敗不是由于錯誤。
? ? 通常這是由于”add”或者”replace”命令本身的要求所引起的,或者該項在刪除隊列之中。
示例
set key 32 0 10 helloworld STORED?
獲取 Key&Value
get key>*參數詳解:
1. key>*: 表示一個或者多個key(以空格分開)
2. \r\n:命令結束
?
響應結果
服務器端將返回0個或者多個的數據項。每個數據項都是由一個文本行和一個數據塊組成。當所有的數據項都接收完畢將收到END\r\n每一項的數據結構:
VALUE key> flags> bytes> data block>參數詳解:
1. key> 希望得到存儲數據的key
2.falg> 發送set命令時設置的標志項
3.bytes>發送數據塊的長度(不包含”\r\n”)
4.\r\n 文本行的結束標志
5.data block> 希望接收的數據項。
6.\r\n 接收一個數據項的結束標志。
PS:如果有些key出現在get命令行中但沒有返回相應的數據,這意味著服務器中不存在該項,可能是超時了,或者被刪除了。
示例
get key VALUE key 32 10 helloworld END?
刪除KeyValue
delete key> time>參數詳解:
1. key> 需要被刪除數據的key
2. time> 客戶端希望服務器將該數據刪除的時間(unix時間或者從現在開始的秒數)
3. \r\n命令頭的結束
?
檢查Memcache服務器狀態
stats在這里可以看到memcache的獲取次數,當前連接數,寫入次數,已經命中率等;
pid : 進程iduptime :總的運行時間,秒數
time : 當前時間
version : 版本號
….
curr_items : 當前緩存中的KeyValue數量
total_items : 曾經總共經過緩存的KeyValue數量
bytes : 所有的緩存使用的內存量
….
curr_connections 當前連接數
cmd_get : 總獲取次數
cmd_set : 總的寫入次數
get_hits : 總的命中次數
miss_hits :? 獲取失敗次數
….
bytes_read : 總共讀取的流量字節數
bytes_written : 總的寫入流量字節
limit_maxbytes : 最大允許使用的內存量,字節
?
清空統計數據
stats reset?
清除單個key值
delete key?
清空所有鍵值
flush_all注:flush并不會將items刪除,只是將所有的items標記為expired,因此這時memcache依舊占用所有內存。
?
退出
quit ? ? 或者 ??Ctrl + ]??
其他命令
1. 顯示各個slab的信息,包括chunk的大小、數目、使用情況等
stats slabs?
2. 顯示各個slab中item的數目和最老item的年齡(最后一次訪問距離現在的秒數)
stats items?
3. 設置或者顯示詳細操作記錄
stats detail [on|off|dump]?
參數為on,打開詳細操作記錄
參數為off,關閉詳細操作記錄
參數為dump,顯示詳細操作記錄(每一個鍵值get、set、hit、del的次數)
?
4. 顯示某個slab中的前limit_num個key列表
stats cachedump slab_id limit_num顯示格式如下:
ITEM key_name> [?<value_length>b;?<expire_time access_time="">s]?
key_name>:鍵名
value_length>:值長度(單位字節)
expire_time|access_time>:memcached 1.2.2及以前版本顯示的是 訪問時間(timestamp)
總結
以上是生活随笔為你收集整理的memcache 缓存的批量删除方案(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring-web源码解析之Filte
- 下一篇: esxi虚机启动慢的问题