文章、博客、商品等功能經(jīng)常需要一個字段統(tǒng)計用戶的點擊量(訪問量),該字段通常需要持久化到數(shù)據(jù)庫中,但數(shù)據(jù)庫是不適合直接應對用戶操作,這種場量如何實現(xiàn)高負載?
主流的系統(tǒng)高負載解決方案,通常把數(shù)據(jù)同步到分布式的ES,多節(jié)點的 Redis 集群中。但點擊量這個字段,需要在頁面中實時展示,用戶刷新頁面時,需要直觀的看到點擊量的變化。
我們首先能想到的,是將點擊量直接存入Redis,展示頁面時從Redis實時讀取,并實時累加,
鍵名格式:article : [id] : hits
鍵值格式:點擊量
這樣設計僅為滿足點擊量功能問題不大,俚進一步的需求來了:熱門文章,熱門商品等功能,需要跟據(jù)點擊量進行排序,或者聚合更多字段進行查詢。因此,點擊量還是是需要更新到數(shù)據(jù)庫和ES中的。但又不能實時更新,因此可以在 redis 存儲點擊量時,增加一個計數(shù)器,當計數(shù)器未到達臨界值時,僅累加Redis,不寫入數(shù)據(jù)庫,當計數(shù)器到達臨界值時,寫入數(shù)據(jù)庫,計數(shù)器歸0
鍵名格式:article : [id] : hits(示例值:article:10:hits)
鍵值格式:點擊量,計數(shù)器(示例值:123,10,表示當前點擊量為123,計數(shù)器為10)
下次訪問后,示例值變?yōu)椋?24,11,表示當前點擊量為124,11,計數(shù)器為11。
當計數(shù)器值到達 1000 時(示例值為:1113,1000),計數(shù)據(jù)歸 0 (1113,0),將 1113 更新到數(shù)據(jù)庫并觸發(fā)ES更新
流程圖如下:

另外,還可以進一步簡化設計,不設置計數(shù)器,用點擊量取模臨界值(點擊量 % 臨界值 === 0),余數(shù)為0時更新數(shù)據(jù)庫。
本文原始網(wǎng)址:https://www.liu12.com/article/hits-function-ha,轉(zhuǎn)載請保留出處