支援綫程的 Perl 缓存系统函數庫

由是一個超落後開發語言 Perl 的函數庫巨獻。這是一個小型緩存管理系統庫。支持在多線程環境下運作。有一個比較完整的演示例子 cacheprovider 可以讓大家測試,當中還包括一個 cacheclient 和 CacheClient.java 客戶端演示例子。

CacheProvider.pm

一個極度簡單的函數庫,最少程度地支持多綫程。通過一個 initcache() 方法啟動,closecache 方法關閉。啟動後會產生一個自我維護綫程調用 housekeepingcache() 清理緩存。

應用例子:

    use CacheProvider;

    &initcache( timeout => 86400, limit => 20000 );
    
    my $id = 15;
    my $domainname = 'abc.com';
    &putcache($id, $domainname);

    my $value = &getcache(15);
 
    &closecache();

通過 putcache 和 getcache 來處理緩存,注意目前不支持永久保存,你可以把 timeout 和 idleperiod 設為一年。緩存就是代表臨時性,會變動的東西,永久保存意義不大。假如你覺得很必要,也許你想多了。

 

putcache($key, $value [, $idle [, $life]])

保存數據。注意$value必須是簡單類型(數字或字符串),假如需要保存數據或hash,可以通過 reference 來保存,即 \@array ,\%hash 等調用,而調用前必須先用 share(...) 共享,不然會報錯。$idle 參數代表假如在這段時間上沒有被調用過(getcache),這個數據將會設為過期,單位為秒。$life 參數代表這個數據的壽命,不管有沒有人調用,過期便會設為過期。過期的數據會在維護中被刪除,儘管未被刪除也會返回 undef。

getcache($key)

讀取數據,過期的數據會返回undef。注意保存時為 reference 的數據,讀取時也會是 reference。

housekeepingcache()

維護方法。可以自行調用,通過 &initcache( noauto => 1 ) 會制止自動維護綫程。尤其是一些服務程序,一般都會有個沒什麽事干的死循環。便可以加入一行調用這個方法來維護緩存。維護邏輯不太複雜,假如緩存數據數量多於 limit,便會刪除 40% 的緩存數據。刪除算法是邊掃描過期的數據,邊按最近被訪問時間順序排列出一個候選刪除數組。數組只會保存需要刪除的量和最舊的數據,假如數量足夠的情況下,訪問時間新于數據最後一個元素的不會被排到數組去,因為死活也不會刪除它的了。所以常會被人調用的數據是不會被刪除的。