原來的訪問計數器策略:
1:獲取緩存的計數器數數字。[用戶取值緩存,文章取值頁面上的數字]
2:根據Session或Cookie對每個用戶在某時間段間只計一次訪問的判斷。
3:在獲取的數字上,進行內存計數+1。
4:概率性直接更新到用戶表和文章表中。
復制代碼
這種方案,會否產生黃金4K的ldb問題,取決于訪問量和概率性問題,概率值設置的越低,越安全,但是如果內存回收很頻繁,丟失數字也常見。
秋色園QBlog 新的訪問計數器優化策略:
1:仍舊保留內存計數器+1的方式。
2:概率性更新,變成統一內置線程定時更新。
這樣處理,原來概率性可能產生的并發更新問題,現在變成1個鏈接在更新,有效的減少黃金4K的問題。
3:為了減少丟失的概率,新開了數據庫(qblogvisit.mdb)及數據表:
新開有兩個表:Blog_UserVisit和Blog_ContentHit。
新開表的字段:ID和Hits
這個新庫的兩個表,加大了更新的頻率,用于物理保存用戶或文章的計數器,避免內存數字丟失的概率,當內存數字丟失時,先從這新表中取出原始數字,再進行+1,有效的減少數字丟失的問題。
復制代碼
PS:內置線程:是一件比較危險的事情,會產生比較想象還多的問題,需要全方位的處理可能產生的:并發,(應用程序池回收時)產生多個線程,異常等問題。
開啟內置線程的代碼:
靜態頁面動態顯示計數器數字
首先:秋色園QBlog 的頁面多數是靜態化的*.html,可是你會發現文章的計數器,無論是首頁,列表,還是文章頁,都是變化的,如何將靜態化的數字,動態的變化顯示?
用js異步?no..秋色園QBlog整站是無js的,如果有js,應該會是另一種實現方式。
然后:由于URLRewrite遇到請求時并非直接轉向*.html,而是全轉向*.ashx,再加載*.html方式,使的后臺程序可以對靜態化的html進行二次處理。
其實:如果你看過本系列的文章,應該會發現一個:Page_OnCache的生命周期,就是在這里動的手腳。
因此:只要獲取列表上的數字,然后再從內存中尋找有沒有相應的數字,有則更新。
結果:這樣訪問計數器的數字就是動態時時顯示了。
復制代碼
顯示動態數字的代碼:
總結
本節通過將頻繁產生數據庫交互動作的計數器部分,變成單線程的更新,有效的解決了黃金4K問題。
同時為了減少數字丟失的概率,增加了新的數據庫來物理存儲文章的數字,但是不改變原有表的結構。
結果:在計數器這塊,目前問題算是解決了。
但是,黃金4K的問題,并沒有結束,因為,除了寫操作,更多的是讀取操作。
正如上節所說:
CYQ.Data 用Lock鎖住插入/更新/刪除,這些步驟,使的同一時間只出現一個鏈接打開。
但是,通過上節的示例,發現了,讀取,也是要打開鏈接的。
因此,優化仍沒有止步,本系列仍在繼續,請繼續關注。