查看積分策略說明發表回覆
Discuz! 代碼
提示插入
直接插入
說明訊息

插入粗體文本 插入斜體文本 插入下劃線 置中對齊 插入超級連結 插入信件位址 插入圖像 插入 flash 插入代碼 插入引言 插入列表
刪除線 直線分隔線 虛線分隔線
    
添加文字底框
內容 [字數檢查]:

表情符號

更多 Smilies
字型大小 |||
溫馨提示:本區開放遊客瀏覽。


文章關鍵字 : [功能說明]
(關鍵字可加強搜索準確性, 如關鍵字多於一組, 請以 , 作分隔, e.g. : 阿笨,shiuh,第一笨)

 關閉 URL 識別 | html 禁用
 關閉 表情符號 | 表情符號 可用
 關閉 Discuz! 代碼 | Discuz! 代碼 可用
使用個人簽名
接收新回覆信件通知
推薦放檔網絡空間

檔案(Torent, zip等)
  1. freedl
  2. multiupload
  3. btghost
  4. 便當狗
  5. mediafire
  6. pillowangel
圖片(JPG, GIF等)
  1. hotimg
  2. tinypic
  3. mousems2
  4. imageshack
  5. imm.io
>>>歡迎推薦好用空間


最新10篇文章回顧
charleshwu

 發表於 2011-8-15 10:10 PM

想加速web server的執行, 建議可以參考以下兩本書,
Steve Souders, Even Faster Web Sites:Performance Best Practices for Web Developers Oreilly, (2009.06.18) 0596522304

Steve Souders, High Performance Web Sites:Essential Knowledge for Front-End Engineers Oreilly, (2007.09.11)  0596529309

分享一下我的經驗, 假如某個 SQL Query 常被執行, 其對應的資料自然就會被 cache 進記憶體裡.
確定各SQL 的Access Plan是合適的, 有正確的 index 即可.


dayi

 發表於 2011-3-18 10:07 AM

我的做法是另外開一個memory table
這個table記錄每個實體db table最後被異動的時間
有一支db的trigger會自動去檢查,然後把異動時間寫到memory table裡

然後在需要用到cache的程式裡會記錄cache最後更新的時間
再用這個時間和memory table裡的時間做比對
時間有更新時才會重下query

不過我的系統架構算是比較特殊的
在web上可能不太適用
只是提供一個參考的方向


Vic

 發表於 2011-3-17 11:08 PM

熊小最近在看有關一些大型網站如何運作的文章...發現有一些同通點。

1. Cache
-將資料存放於RAM...以減少db的查詢...比較常用的是memcached(user data cache, 支援跨主機)...APC(Opcode + user data cache, 不過只限同一主機)

2. NoSQL
-取代MySQL等Relational DB...(內容後補)

3. CDN
-Content Delivery Network...也就是用其他網絡供應商放置一些用戶存取的檔案...分散處理 (內容後補)


這次主要關於cache方面...雖然discuz有一些cache的功能...不過只限於file based...如要加快存取速度...以APC/memcached等memory cache效果更好。

論壇一直有用APC做Opcode caching...不過user data就沒試過。


本次目標是cache db query...以減少對db query的次數。

1. 安裝APC for pecl (最新的stable是3.1.6)
2. 查找論壇那些部份可以做caching
3. 利用apc_store / apc_fetch 來存取cache data

以下一條discuz常見的query

引用:
$query = $db->query("SELECT * FROM {$tablepre}threads t WHERE tid='$tid' AND displayorder>='0'");
$var = $db->fetch_array($query);


修改成APC版..用一個簡單function,  加到include/global.func.php

引用:
function query_cache($sql,$ttl=86400) {
        if ($sql == '')
                return null;

        global $db;
        $iKey = md5($sql);
        if (!$cached_res = apc_fetch($iKey)) {
                $query = $db->query($sql);
                while($this_res = $db->fetch_array($query)) {
                        $cached_res[]        =        $this_res;
                }
                apc_store($iKey, $cached_res,$ttl);
        return $cached_res;
}


本來的code改成:

引用:
$sql = "SELECT * FROM {$tablepre}threads t WHERE tid='$tid' AND displayorder>='0'"
$var = query_cache($sql);



結果 (as of 2011-03-17)

減少query數如下
index.php - 1
forumdisplay.php - 3
viewthread.php - 3

問題:

1. cache何時refresh
-當forumdisplay被cache後...新增主題/回覆不會顯示...因為它們不存在於cache內...這時必須刪除舊cache而重新query db以得到新cache...但因為apc_delete不支援prefix/suffix刪除...md5後的key變得難以單一刪除...現在的做法是當有新增文章/回覆時...刪除全部cache...方法不是很好...不過暫時沒想到更好的.

2. discuz內query最多的是common.inc.php內有關memeber...與viewthread.php有關post...不過2者太多..(每個member, 每個post都是一個獨立query)...cache效果不大。





所在時區為 GMT+8, 現在時間是 2024-11-22 12:26 AM
清除 Cookies - 連絡我們 - TWed2k © 2001-2046 - 純文字版 - 說明
Discuz! 0.1 | Processed in 0.017025 second(s), 6 queries , Qzip disabled