服務(wù)器架構(gòu)與高并發(fā)性能測(cè)試實(shí)戰(zhàn)方案(二)
- 作者:新網(wǎng)
- 來(lái)源:新網(wǎng)
- 瀏覽:100
- 2018-05-10 17:55:04
場(chǎng)景中的這些業(yè)務(wù)基本是用戶(hù)進(jìn)入APP后會(huì)操作到的,除了活動(dòng)日(618、雙11等),這些業(yè)務(wù)的用戶(hù)量都不會(huì)高聚集,同時(shí)這些業(yè)務(wù)相關(guān)的表都是大數(shù)據(jù)表,業(yè)務(wù)多是查詢(xún)操作,所以我們需要減少用戶(hù)直接命中DB的查詢(xún);優(yōu)先查詢(xún)緩存,如果緩存不存在,再進(jìn)行DB查詢(xún),將查詢(xún)結(jié)果緩存起來(lái)。
3.實(shí)戰(zhàn)方案
<
div>

1)通用方案
日用戶(hù)流量大,但是比較分散,偶爾會(huì)有用戶(hù)高聚的情況;
場(chǎng)景: 用戶(hù)簽到,用戶(hù)中心,用戶(hù)訂單等。
說(shuō)明:
場(chǎng)景中的這些業(yè)務(wù)基本是用戶(hù)進(jìn)入APP后會(huì)操作到的,除了活動(dòng)日(618、
雙11等),這些業(yè)務(wù)的用戶(hù)量都不會(huì)高聚集,同時(shí)這些業(yè)務(wù)相關(guān)的表都是大數(shù)據(jù)表,業(yè)務(wù)多是查詢(xún)操作,所以我們需要減少用戶(hù)直接命中DB的查詢(xún);優(yōu)先查詢(xún)緩存,如果緩存不存在,再進(jìn)行DB查詢(xún),將查詢(xún)結(jié)果緩存起來(lái)。
更新用戶(hù)相關(guān)緩存需要分布式存儲(chǔ),比如使用用戶(hù)ID進(jìn)行hash分組,把用戶(hù)分布到不同的緩存中,這樣一個(gè)緩存集合的總量不會(huì)很大,不會(huì)影響查詢(xún)效率。
方案如:
用戶(hù)簽到獲取積分:
計(jì)算出用戶(hù)分布的key,Redis,hash中查找用戶(hù)今日簽到信息
如果查詢(xún)到簽到信息,返回簽到信息
如果沒(méi)有查詢(xún)到,DB查詢(xún)今日是否簽到過(guò),如果有簽到過(guò),就把簽到信息同步Redis緩存。
如果DB中也沒(méi)有查詢(xún)到今日的簽到記錄,就進(jìn)行簽到邏輯,操作DB添加今日簽到記錄,添加簽到積分(這整個(gè)DB操作是一個(gè)事務(wù))
緩存簽到信息到Redis,返回簽到信息
注意這里會(huì)有并發(fā)情況下的邏輯問(wèn)題,如:一天簽到多次,發(fā)放多次積分給用戶(hù)。
用戶(hù)訂單:
這里我們只緩存用戶(hù)第一頁(yè)的訂單信息,一頁(yè)40條數(shù)據(jù),用戶(hù)一般也只會(huì)看第一頁(yè)的訂單數(shù)據(jù)
用戶(hù)訪問(wèn)訂單列表,如果是第一頁(yè)讀緩存,如果不是讀DB
計(jì)算出用戶(hù)分布的key,Redis,hash中查找用戶(hù)訂單信息
如果查詢(xún)到用戶(hù)訂單信息,返回訂單信息
如果不存在就進(jìn)行DB查詢(xún)第一頁(yè)的訂單數(shù)據(jù),然后緩存redis,返回訂單信息
用戶(hù)中心:
計(jì)算出用戶(hù)分布的key,Redis hash中查找用戶(hù)訂單信息
如果查詢(xún)到用戶(hù)信息,返回用戶(hù)信息
如果不存在進(jìn)行用戶(hù)DB查詢(xún),然后緩存redis,返回用戶(hù)信息