原先我不明白 cache_count 有什么作用,現在談談它的用法.
cache_count() 函數第一次看到是在 PHPCMS2008 中,作用是緩存一條 COUNT(*) SQL 查詢的結果,如:
cache_count("SELECT COUNT(*) AS count FROM ...")
有一次在寫一個后臺分頁功能時,統計 COUNT(*) 總數的查詢使用了 cache_count 做緩存,但在測試分頁功能時發現分頁無效,本來應有第二頁的,但分頁結果卻還是只有一頁,原來是因為統計的查詢語句被 cache_count 緩存了且緩存有效期還未過,因此分頁結果還是原來的一頁.
當時我斷定,cache_count 既影響測試又沒用.
但是我錯了,想象一下:
總共有 88331 條記錄,每頁顯示 20 條,共 4417 頁。列表頁是前臺頁面,假設有 10 個并發訪問,每個都訪問不同的頁數,比如 1, 3, 5 頁.
于是我發現,COUNT(*) 的結果實際上是一樣的,無論是第 1 頁,還是第 1000 頁,只要數據不變,COUNT(*) 也不會變,實際上,當頁數大于 1000 頁以后,那怕每天增加 100 頁左右的記錄數,由于增加的記錄是排在前面的,今天的頁數到底是 4417 還是 4517 一點關系都沒有——根本不會有真正的用戶會去看第 4500 多頁的數據.
設現在統計 COUNT(*) 需要用時 0.1(s),每天列表頁會被訪問 100 次,那么,COUNT(*) 總用時為 0.1*100 = 10(s) ——花 10(s) 去取 100 個相同的結果.
所以要用 cache_count,緩存有效期為 1 天,于是,無論今天列表頁被訪問多少次,都只需執行一次 0.1(s) 的統計,后面每次讀取緩存只需用時約 0.0002(s).
訪問次數越多,節省的時間就越多,這就是 cache_count 的作用,所以,列表頁都可以用 cache_count(),唯一需要注意的只是根據數據量的不同設計不同的緩存有效期.
PHPCMS cache_count() 的緩存有效期用常量定義,這不方便靈活地控制每條查詢的緩存有效期,所以我把緩存有效期也加入為 cache_count 的參數,原形如下:
cache_count($sql, $timeout = 默認緩存有效期)
%%
# 歷史
2011-10-14 初稿,包含 cache_count() 及 page_select() 兩個函數的說明.
2012-04-22 刪除 page_select() 函數的說明,只說明 cache_count() 函數.
新聞熱點
疑難解答