国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

每秒100W次的計數,架構原來可以這樣設計!

開發 開發工具 架構
在業務復雜,計數擴展頻繁,數據量大,并發量大的情況下,計數系統的架構演進與實踐,是本文將要分享的問題。

今天和大家聊聊計數系統。

畫外音:文章較長,可提前收藏。

計數系統解決什么業務問題?

很多業務都有“計數”需求,以微博為例:

[[410277]]

微博首頁的個人中心部分,有三個重要的計數:

  • 關注了多少人的計數;
  • 粉絲的計數;
  • 發布博文的計數;

微博首頁的博文消息主體部分,也有有很多計數,分別是一條博文的:

  • 轉發計數;
  • 評論計數;
  • 點贊計數;
  • 甚至是瀏覽計數;

畫外音:瀏覽計數有點難,每秒100W次PV,就有100W次計數。

在業務復雜,計數擴展頻繁,數據量大,并發量大的情況下,計數系統的架構演進與實踐,是本文將要分享的問題。

如何最快速的實現業務計數呢?

count計數法。

典型的互聯網架構,常常分為這么幾層:

  • 調用層:處于端上的browser或者APP;
  • 站點層:拼裝html或者json返回的web-server層;
  • 服務層:提供RPC調用接口的service層;
  • 數據層:提供固化數據存儲的db,以及加速存儲的cache;

針對上文微博計數的例子,主要涉及“關注”業務,“粉絲”業務,“微博消息”業務,一般來說,會有相應的db存儲相關數據,相應的service提供相關業務的RPC接口:

  • 關注服務:提供關注數據的增刪查改RPC接口;
  • 粉絲服務:提供粉絲數據的增刪查改RPC接口;
  • 消息服務:提供微博消息數據的增刪查改RPC接口,消息業務相對比較復雜,涉及微博消息、轉發、評論、點贊等數據的存儲;

對關注、粉絲、微博業務進行了初步解析,那首頁的計數需求應該如何滿足呢?

很容易想到,關注服務+粉絲服務+消息服務均提供相應接口,就能拿到相關計數數據。


例如,個人中心首頁,需要展現博文數量這個計數,web層訪問message-service的count接口,這個接口執行:

  1. select count(*) from t_msg where uid = XXX 

[[410279]]

同理,也很容易拿到關注,粉絲的這些計數。

這個方案叫做“count”計數法,在數據量并發量不大的情況下,最容易想到且最經常使用的就是這種方法。

count計數法存在什么問題呢?

隨著數據量的上升,并發量的上升,這個方法的弊端將逐步展現。

例如,微博首頁有很多條微博消息,每條消息有若干計數,此時計數的拉取就成了一個龐大的工程:

整個拉取計數的偽代碼如下:

  1. list<msg_id> = getHomePageMsg(uid);// 獲取首頁所有消息 
  2. for( msg_id in list<msg_id>){ // 對每一條消息 
  3.          getReadCount(msg_id);  // 閱讀計數 
  4.          getForwordCount(msg_id); // 轉發計數 
  5.          getCommentCount(msg_id); // 評論計數 
  6.          getPraiseCount(msg_id); // 贊計數 

其中:

  • 每一個微博消息的若干個計數,都對應4個后端服務訪問;
  • 每一個訪問,對應一條count的數據庫訪問(count要了老命了);

其效率之低,資源消耗之大,處理時間之長,可想而知。

“count”計數法方案,可以總結為:

  • 多條消息多次查詢,for循環進行;
  • 一條消息多次查詢,多個計數的查詢;
  • 一次查詢一個count,每個計數都是一個count語句;

那如何進行優化呢?

計數外置法。

計數是一個通用的需求,有沒有可能,這個計數的需求實現在一個通用的系統里,而不是由關注服務、粉絲服務、微博服務來分別來提供相應的功能呢?

畫外音:各個業務系統具備的通用痛點,應該下沉統一解決。

可以抽象一個通用的計數服務。

通過分析,上述微博的業務可以抽象成兩類:

  • 用戶(uid)維度的計數:用戶的關注計數,粉絲計數,發布的微博計數;
  • 微博消息(msg_id)維度的計數:消息轉發計數,評論計數,點贊計數;

于是可以抽象出兩個表,針對這兩個維度來進行計數的存儲:

  1. t_user_count (uid, gz_count, fs_count, wb_count); 
  2. t_msg_count (msg_id, forword_count, comment_count, praise_count); 

甚至可以更為抽象,一個表搞定所有計數:

  1. t_count(id, type, c1, c2, c3, …) 

通過type來判斷,id究竟是uid還是msg_id,但并不建議這么做。

存儲抽象完,再抽象出一個計數服務對這些數據進行管理,提供友善的RPC接口:

這樣,在查詢一條微博消息的若干個計數的時候,不用進行多次數據庫count操作,而會轉變為一條數據的多個屬性的查詢:

  1. for(msg_id in list<msg_id>) { 
  2. select forword_count, comment_count, praise_count  
  3.     from t_msg_count  
  4.     where msg_id=$msg_id; 

甚至,可以將微博首頁所有消息的計數,轉變為一條IN語句(不用多次查詢了)的批量查詢:

  1. select * from t_msg_count  
  2.     where msg_id IN 
  3.     ($msg_id1, $msg_id2, $msg_id3, …); 

IN查詢可以命中msg_id聚集索引,效率很高。

那么,當有微博被轉發、評論、點贊的時候,計數服務如何同步的進行計數的變更呢?

如果讓業務服務來調用計數服務,勢必會導致業務系統與計數系統耦合。可以通過MQ來解耦,在業務發生變化的時候,向MQ發送一條異步消息,通知計數系統計數發生了變化即可:

如上圖:

  • 用戶新發布了一條微博;
  • msg-service向MQ發送一條消息;
  • counting-service從MQ接收消息;
  • counting-service變更這個uid發布微博消息計數;

畫外音:其實發送一條微博本來就會發MQ消息,計數系統只是新增一個訂閱方。

這個方案稱為“計數外置”,可以總結為:

  • 通過counting-service單獨保存計數;
  • MQ同步計數的變更;
  • 多條消息的多個計數,一個批量IN查詢完成;

計數外置可能存在什么新的問題呢?

計數外置,本質是數據的冗余,架構設計上,數據冗余必將引發數據的一致性問題,需要有機制來保證計數系統里的數據與業務系統里的數據一致,常見的方法有:

  • 對于一致性要求比較高的業務,要有定期check并fix的機制,例如關注計數,粉絲計數,微博消息計數等;
  • 對于一致性要求比較低的業務,即使有數據不一致,業務可以接受,例如微博瀏覽數,微博轉發數等;

計數外置很大程度上解決了計數存取的性能問題,但是否還有優化空間呢?

像關注計數,粉絲計數,微博消息計數,變化的頻率很低,查詢的頻率很高,這類讀多些少的業務場景,非常適合使用緩存來進行查詢優化,減少數據庫的查詢次數,降低數據庫的壓力。

但是,緩存是kv結構的,無法像數據庫一樣,設置成

  1. t_uid_count(uid, c1, c2, c3) 

這樣的schema,如何來對kv進行設計呢?

緩存kv結構的value是計數,看來只能在key上做設計,很容易想到,可以使用uid:type來做key,存儲對應type的計數。

對于uid=123的用戶,其關注計數,粉絲計數,微博消息計數的緩存就可以設計為:

此時對應的counting-service架構變為:

如此這般,多個uid的多個計數,又可能會變為多次緩存的訪問:

  1. for(uid in list<uid>) { 
  2.  memcache::get($uid:c1, $uid:c2, $uid:c3); 

這個“計數外置緩存優化”方案,可以總結為:

  • 使用緩存來保存讀多寫少的計數;

畫外音:其實寫多讀少,一致性要求不高的計數,也可以先用緩存保存,然后定期刷到數據庫中,以降低數據庫的讀寫壓力。

  • 使用id:type的方式作為緩存的key,使用count來作為緩存的value;
  • 多次讀取緩存來查詢多個uid的計數;

緩存的使用能夠極大降低數據庫的壓力,但多次緩存交互依舊存在優化空間,有沒有辦法進一步優化呢?

不要陷入思維定式,誰說value一定只能是一個計數,難道不能多個計數存儲在一個value中么?

緩存kv結構的key是uid,value可以是多個計數同時存儲。

對于uid=123的用戶,其關注計數,粉絲計數,微博消息計數的緩存就可以設計為:

這樣多個用戶,多個計數的查詢就可以一次搞定:

  1. memcache::get($uid1, $uid2, $uid3, …); 

然后對獲取的value進行分析,得到關注計數,粉絲計數,微博計數。

如果計數value能夠事先預估一個范圍,甚至可以用一個整數的不同bit來存儲多個計數,用整數的與或非計算提高效率。

這個“計數外置緩存批量優化”方案,可以總結為:

  • 使用id作為key,使用同一個id的多個計數的拼接作為value;
  • 多個id的多個計數查詢,一次搞定;

考慮完效率,架構設計上還需要考慮擴展性,如果uid除了關注計數,粉絲計數,微博計數,還要增加一個計數,這時系統需要做什么變更呢?

之前的數據庫結構是:

  1. t_user_count(uid, gz_count, fs_count, wb_count) 

這種設計,通過列來進行計數的存儲,如果增加一個XX計數,數據庫的表結構要變更為:

  1. t_user_count(uid, gz_count, fs_count, wb_count, XX_count) 

在數據量很大的情況下,頻繁的變更數據庫schema的結構顯然是不可取的,有沒有擴展性更好的方式呢?

不要陷入思維定式,誰說只能通過擴展列來擴展屬性,能不能通過擴展行來擴展屬性呢?

答案是肯定的,完全可以這樣設計表結構:

  1. t_user_count(uid, count_key, count_value) 

如果需要新增一個計數XX_count,只需要增加一行即可,而不需要變更表結構:

總結

小小的計數,在數據量大,并發量大的時候,其架構實踐思路為:

(1)計數外置:由“count計數法”升級為“計數外置法”;

(2)讀多寫少,甚至寫多但一致性要求不高的計數,需要進行緩存優化,降低數據庫壓力;

(3)緩存kv設計優化,可以由[key:type]->[count],優化為[key]->[c1:c2:c3]即:

優化為:

(4)數據庫擴展性優化,可以由列擴展優化為行擴展即:

優化為:

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文 

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2019-09-16 09:34:39

2021-06-23 06:48:42

秒殺Java電商

2025-09-29 09:49:26

2020-03-26 08:07:28

紅包架構請求

2025-11-17 09:06:13

架構計數業務數據庫

2025-11-19 09:05:38

2025-09-23 07:08:40

2025-01-02 09:17:37

2019-08-23 09:03:04

盤口數據數據庫緩存

2019-08-27 08:51:36

計數數據庫并發

2024-11-19 09:15:40

搜索類型MySQL

2013-09-18 10:44:01

搜狗輸入法詞語

2025-06-03 02:10:00

2024-09-05 21:24:02

數據庫查詢MySQLlimit

2023-02-26 17:24:53

8G內存線程

2019-07-29 14:40:26

架構存儲檢索

2019-05-05 09:28:59

架構數據查詢

2024-08-12 09:43:42

2023-12-11 13:57:00

RFM模型激勵機制

2020-12-28 08:36:30

C語言編程泛型
點贊
收藏

51CTO技術棧公眾號

精品视频亚洲| 久久综合九色综合欧美98| 亚洲va在线| 精品av导航| 羞羞影院欧美| 欧产日产国产精品视频| 激情影院在线观看| 国内av一区二区三区| 中文字幕在线免费观看| 天堂社区日本电影超碰| 色戒在线免费观看| 免费一级特黄毛片| www污在线观看| 国产xxxx振车| 久久观看最新视频| 亚洲一区二区免费视频软件合集| 久久精品五月婷婷| 精品国产乱码久久久久久郑州公司 | 无码av免费一区二区三区试看 | 91丨porny丨中文| av免费精品一区二区三区| 午夜看片在线免费| 奇米4444一区二区三区| 91sao在线观看国产| 国模精品系列视频| 7777精品视频| 日本中文字幕成人| 国产精品人成电影| 国产日韩欧美电影在线观看| 91视频国产高清| 91在线免费视频| 99re在线播放| 国产偷国产偷亚洲高清97cao| 精品一区二区日本| 亚欧精品在线| 在线观看av的网址| 国产精品50p| 中文字幕国产免费| 超碰在线12| 黑人与亚洲人色ⅹvideos| 久久日韩视频| 中文字幕在线高清| 精品国产乱码久久久久久樱花| 精品女人视频| 婷婷久久综合| 午夜在线精品| 国产精品一级在线| 国产视频亚洲色图| 亚洲高清在线精品| 欧美日韩免费高清一区色橹橹| 精品成人私密视频| 尤物tv国产一区| 97久久精品视频| 91精品国产自产在线| 国精产品一区二区| 强伦女教师2:伦理在线观看| 成人小视频在线看| 一本到av在线| 9191在线播放| 成人在线免费电影网站| 加勒比色老久久爱综合网| 久久精品亚洲欧美日韩精品中文字幕| 国产欧美亚洲一区| 成人午夜视频免费看| 亚洲免费观看高清完整| 欧美日韩免费视频| 宅男66日本亚洲欧美视频| 欧美有码在线视频| 国产免费一区二区| 亚洲精品天堂成人片av在线播放| 欧美污视频网站| 三级毛片在线免费看| 国产一线二线在线观看| 精品91福利视频| 久久精品高清| 青青草一区二区三区| 91毛片在线观看| 天天操天天综合网| 精品久久五月天| 久久久久久有精品国产| 高清一区二区三区视频| av动漫在线播放| 国产一级视频| 亚洲区欧洲区| 成人资源在线| 国产一区二区三区成人欧美日韩在线观看| 国产成人精品三级| 亚洲国产成人av网| 亚洲韩国欧洲国产日产av | 成人国产精品入口免费视频| 美女亚洲一区| 日韩专区中文字幕一区二区| 国产亚洲一区二区三区四区| 午夜av区久久| 亚洲免费视频观看| 国产成人+综合亚洲+天堂| 日本精品二区| 免费羞羞视频网站| 人人干在线视频| 136导航精品福利| 亚洲深夜av| 欧美国产日本视频| 日韩一区二区在线观看视频播放| 色综合老司机第九色激情| 国产综合第一页| 88av.com| av色综合久久天堂av色综合在| 国产成人高清精品免费5388| 久久99伊人| 亚洲乱码中文字幕| 亚洲另类欧美自拍| 成人黄色免费片| 九色在线视频观看| 欧美激情黑人| 牲欧美videos精品| 国产一区二区三区免费播放 | 亚洲乱码精品一二三四区日韩在线| 日韩欧美亚洲国产另类| 日韩免费精品视频| 欧美日韩在线免费观看视频| 在线观看av影片| 久久国产三级| 一区二区日本视频| 亚洲日本青草视频在线怡红院| 亚洲精品xxx| 99精品国产一区二区| 日本激情视频在线| 俺来也官网欧美久久精品| 成人激情视频| 久久综合给合久久狠狠狠97色69| 欧美一区二区三区在线| 国产精品入口尤物| 日韩有码免费视频| 超碰99在线| 亚洲欧美一级二级三级| 国产精品欧美久久久久无广告| 日韩电影免费在线观看中文字幕| 国产在线精品播放| www日韩在线观看| 日韩av一卡| 激情久久一区| 亚洲一区免费观看| 欧美日韩福利电影| 国产911在线观看| 羞羞的网站在线观看| 68国产成人综合久久精品| 中文字幕日本不卡| 久久夜色精品国产欧美乱| 中文字幕av日韩精品| 最新97超碰在线| 日韩成人激情| 国产精品不卡在线| 精品国产一区二区三区四区在线观看 | 视频国产精品| 国产在线看一区| 91麻豆精品国产91久久久资源速度| 国产精品一二三视频| 国产精品区在线| 精品视频在线观看免费观看| 国产在线播放一区二区三区| 69堂成人精品免费视频| 99久久99久久精品国产片| 精品女厕厕露p撒尿| 香蕉久久99| 中文字幕不卡的av| 中文字幕亚洲一区| 欧美性受黑人性爽| 欧美人与禽猛交乱配| 一本色道久久综合亚洲精品高清| 日韩欧美有码在线| 国产欧美精品日韩| 动漫成人在线| 国产区精品区| 亚洲欧美色综合| 91国产精品电影| 色婷婷狠狠18| 一区二区三区在线免费看| 91婷婷韩国欧美一区二区| 亚洲天堂免费观看| 男女激烈动态图| 在线观看福利电影| 久久99国产精品久久| 亚洲国产精品久久91精品| 新呦u视频一区二区| 欧美bbbxxxxx| 日本美女视频一区二区| 欧美一激情一区二区三区| 国严精品久久久久久亚洲影视 | 美女18一级毛片一品久道久久综合| 日日欢夜夜爽一区| 日韩欧美一级二级| 五月天丁香综合久久国产| 91黄色在线| 蜜臀av性久久久久av蜜臀妖精 | 高清成人在线| 国产成人日日夜夜| 中文一区二区视频| 无码aⅴ精品一区二区三区浪潮| 国产原创一区| 久久免费看少妇高潮|