產品經理不清楚我們的介面給使用者返回的具體的提示資訊是什麼,有一些可能是程式設計師能看懂,但是對使用者不友好的提示。產品就想看一下,如果需要修改,則修改了,使用者看到的是修改後的提示。
這個需求如果是對於乙個新專案來說,可以將所有返回給使用者的提示,單獨配置到配置檔案中,產品就可以直接看配置檔案,修改配置檔案了。但是對於乙個已經執行的線上系統來說,這樣改動的話,範圍太大了,再有就是有一些是第三方平台返回給我們的資訊,我們不太好控制。因此就換了一種方式,在aop層對所有的使用者返回進行攔截,如果攔截到之前沒有記錄的返回資訊,需要記錄下來,如果已經記錄下來了,則判斷後台是否設定了替換資訊,如果有則替換。
整個流程相對比簡單,但是查詢,插入,替換的這裡涉及查詢效率的問題,有如下方案:
1.查詢,插入,替換直接訪問資料庫,線上訪問併發很高,資料庫io受不了。
2.增加redis快取,查詢的時候,先查詢redis快取,判斷之前有沒有記錄返回資訊和替換資訊,如果沒有,則查詢資料庫,寫回redis,如果資料庫中也沒有,則需要加redis全域性鎖後,插入到資料庫中,然後寫入redis。如果後台編輯了某條資訊的替換資訊,則刪除redis中的快取,讓程式訪問的時候自然載入到redis中。這個方式大大減輕了資料庫的壓力,由於redis是基於記憶體的,因此速度也是比較快的,但是應用伺服器和redis之間的io就比較高了。
3.採用應用程式內快取,在應用程式內增加乙個全域性的map快取,在查詢的時候,查詢map中有沒有記錄,沒有的話,查詢資料庫,回寫map,如果資料庫中也沒有,則需要加redis全域性鎖後,插入到資料庫中,然後寫入map。如果後台編輯了某條資訊的替換資訊,則採用發布訂閱模式的訊息佇列,更新每乙個程序中map的資訊。
從方案1到方案3,程式反應的速度越來越快,當然邏輯也越來越複雜。方案3對於大多數情況,程式幾乎沒有延遲。
換個思路來看這個問題,就是空間換時間。還能不能進一步擴充套件這個問題呢,當然可以,就是在每乙個執行緒中都使用一套快取,採用localthread變數,給每乙個執行緒都儲存乙個變數,連線程間的鎖都不需要了。
vim替換功能
range s pattern string c,e,g,i 5.1 range指的是範圍,1,7 指從第一行至第七行,1,指從第一行至最後一行,也就是整篇文章,也可以 代表。還記得嗎?是目前編輯的文章,是前一次編輯的文章。pattern就是要被替換掉的字串,可以用 regexp 來表示。strin...
VIM替換功能
1 替換 substitute range s pattern string c,e,g,i 5.1 range 指的是範圍,1,7 指從第一行至第七行,1,指從第一行至最後一行,也就是整篇文章,也可以 代表。還記得嗎?是目前編輯的文章,是前一次編輯的文章。pattern 就是要被替換掉的字串,可以...
shell替換功能
據了解,替換功能有sed,sub,gsub,gensub四種,下面分別講解其應用方式。資料來源如下 snk17173 3 東方玄幻 傳奇 2 網遊 4 意境 snk17173 3 東方玄幻 傳奇 2 網遊 4 意境 snk17173 3 東方玄幻 傳奇 2 網遊 snk17173 3 東方玄幻 傳奇...