webman中,為了加快處理的效率并減少IO,做了內(nèi)存緩存。即根據(jù)請求的數(shù)據(jù),從數(shù)據(jù)庫中查詢到數(shù)據(jù)后加載到了靜態(tài)數(shù)組LoadData::$data
中,供下次請求直接使用。
請問如何解決用戶刪除了對應(yīng)數(shù)據(jù)后,內(nèi)存緩存也要刪除的問題, 需要每個worker進程都清理,請問該如何處理?
由于考慮到性能因素,所以沒使用apcu等共享內(nèi)存機制。在不使用共享內(nèi)存存放$data
的前提下,怎么處理呢?
考慮每個worker進程訂閱redis的頻道,然后推送,但是可能存在不穩(wěn)定的情況。
你這不是脫褲子放屁嗎?在乎這點點性能還不如好好優(yōu)化下SQL語句和數(shù)據(jù)表設(shè)計加緩存來得快。你這樣有可能會造成內(nèi)存泄漏
架構(gòu)師眼里:沒有是加一層解決不了問題,一層不夠就加二層。
給你一個多級緩存思路;
虛假的減少io:無腦將數(shù)據(jù)填入本地內(nèi)存
真實的減少io:合理分析自己的應(yīng)用場景,為每一類數(shù)據(jù)選擇合適的緩存方式
枚舉類數(shù)據(jù)是可以直接加載到內(nèi)存的,用戶token,熱門商品詳情可以加載到redis這類緩存當中(使用更快的io而并非減少),文章詳情這類本身內(nèi)容多的數(shù)據(jù),但是查詢條件只有id的場景,緩存的意義幾乎沒有。
LoadData::$data這種數(shù)據(jù),如果遇到頻繁更新其中某個數(shù)據(jù)的場景每次變動一行重載整個緩存往往得不償失
我的業(yè)務(wù)場景是用戶添加自己的問答庫,包括關(guān)鍵詞、回答等,問答庫審核通過后進行發(fā)布,發(fā)布實際就是把問答庫所有內(nèi)存加載到文件xxx.json中。 使用就是有很多請求攜帶問答庫的ID進來走不同的問答庫邏輯?,F(xiàn)在實現(xiàn)的事:當咨詢請求進入后,加載對應(yīng)的問答庫內(nèi)容到內(nèi)存中,并進行問答庫分支邏輯,直到用戶結(jié)束咨詢。自動釋放: 當該問答庫在20分鐘內(nèi)沒有被咨詢時,系統(tǒng)自動釋放這部分內(nèi)存。手動釋放:當重新發(fā)布后,手動釋放回答庫的內(nèi)存。 每個worker進程都釋放的是通過在afterWorker中添加定時器,定時掃描。