基于使用者的回報和需求,ocs近日新增加了對兩個memcached指令的支援:gat(getandtouch)以及flush。
首先來看gat(getandtouch)指令。它能夠在擷取資料的同時更新該資料的過期時間,其用法為:getandtouch(string key, int newexptime)
這個指令不屬于标準memcached協定中定義的操作,但是在使用者使用中,卻有着一定的實際意義。通過使用該指令,我們可以更合理有效地利用ocs的緩存空間,使緩存裡始終存儲的都是真正的熱點資料。目前java spy和java xmemcached用戶端已經支援此指令。
java程式示例片段如下:
mc.set(“mykey”, 5, “value”);//将資料首次set進ocs
<b>while</b> (<b>true</b>) {
//在取回該資料的同時,将其過期時間更新為2秒後
system.out.println(“gat:” + <b>mc.getandtouch</b>(“mykey”, 2));
//暫停半秒。模拟在實際業務中,此資料每隔半秒被通路一次
thread.sleep(500);
}
在上述代碼中可以看見,每次通過<b>getandtouch</b>讀取資料的同時都更新了它的過期時間為2秒後。是以當該資料被頻繁通路時(2秒之内被不斷通路),它将始終不過期;在實際業務使用中,如果該資料的通路頻率降低(2秒之内沒有被通路),它将會自動過期被淘汰出ocs緩存。
另外一個為flush指令。它屬于memcached标準協定定義的操作,各主流用戶端支援此指令。該指令的功能是清除使用者目前的ocs緩存執行個體内所有的資料及統計資訊。之前ocs使用者是通過在控制台上點選“清空緩存”按鈕來實作此功能,現在則可以通過指令方式實作。用法也非常簡單:ocs_cache.flush()即可。
在實作上,ocs與memcached一樣,flush指令是将所有資料辨別為expired,并不會真正的立刻釋放已有資料的記憶體,而是用存入的新資料重用那些記憶體,逐漸清理緩存中原有過期資料。需要指出的是,ocs完成此指令的時間精度約為1秒以内。在使用中需要注意如下情況:
ocs_cache.<b>flush</b>();
ocs_cache.<b>set</b>(“key”, 0, “value”);
ocs_cache.get(“key”); //這裡可能傳回not found
在這個例子中,第二行set指令執行的時間點和第一行flush指令在同一個自然秒内,則該資料可能會被flush清理,以至于第三行的get無法取得該資料。這種情況需要在程式中注意避免。