国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL中實(shí)現(xiàn)高性能高并發(fā)計數(shù)器方案(例如文章點(diǎn)擊數(shù))

2020-01-18 23:04:55
字體:
供稿:網(wǎng)友

現(xiàn)在有很多的項目,對計數(shù)器的實(shí)現(xiàn)甚是隨意,比如在實(shí)現(xiàn)網(wǎng)站文章點(diǎn)擊數(shù)的時候,是這么設(shè)計數(shù)據(jù)表的,如:”article_id, article_name, article_content, article_author, article_view……在article_view中記錄該文章的瀏覽量。詐一看似乎沒有問題。對于小站,比如本博客,就是這么做的,因?yàn)樾〔说牟┛碗y道會涉及并發(fā)問題嗎?答案顯而易見,一天沒多少IP,而且以后不會很大。

言歸正傳,對文章資訊類為主的項目,在瀏覽一個頁面的時候不但要進(jìn)行大量的查(查詢上文的記錄,已經(jīng)所屬分類的名字、熱門文章資訊評論、TAG等),還要進(jìn)行寫操作(更新瀏覽數(shù)點(diǎn)擊數(shù))。把文章的詳細(xì)內(nèi)容和計數(shù)器放在一張表盡管對開發(fā)很方便,但是會造成數(shù)據(jù)庫的壓力過大(不然為什么大項目都要分庫分表呢)。

那么,分兩張表存放就好了么?一張表存文章詳細(xì)信息,另一張表單獨(dú)存計數(shù)器。

復(fù)制代碼 代碼如下:

CREATE TABLE `article_view`(
`article_id` int(11) NOT NULL,
`view` int(11) NOT NULL,
PRIMARY KEY (`article_id`)
)ENGINE=InnoDB;

這種方式,雖然分擔(dān)了文章表的壓力,但是每當(dāng)有一個進(jìn)程請求更新的時候,都會產(chǎn)生全局的互斥鎖,只能串行,不能并行。在高并發(fā)下會有較長的等待時間。

另一種比較好的辦法是對每一個文章的計數(shù)器不是一行,而是多行,比如吧,一百行。每次隨機(jī)更新其中一行,該文章的瀏覽數(shù)就是所有行的和。

復(fù)制代碼 代碼如下:

CREATE TABLE `article_view`(
`article_id` int(11) NOT NULL,
`pond` tinyint(4) NOT NULL COMMENT '池子,就是用來隨機(jī)用的',
`view` int(11) NOT NULL,
PRIMARY KEY (`article_id`,`pond`)
)ENGINE=InnoDB;

小訪問量的隨機(jī)池子100個肯定多了,三五個足矣。每次訪問的時候,隨機(jī)一個數(shù)字(1-100)作為pond,如何該pond存在則更新view+1,否則插入,view=1。借助DUPLICATE KEY,不然在程序里是實(shí)現(xiàn)得先SELECT,判斷一下再INSERT或者UPDATE。

復(fù)制代碼 代碼如下:

INSERT INTO `article_view` (`article_id`, `pond`, `view`) VALUES (`123`, RAND()*100, 1) ON DUPLICATE KEY UPDATE `view`=`view`+1

獲取指定文章的總訪問量的時候:

復(fù)制代碼 代碼如下:

SELECT SUM(`view`) FROM `article_view` WHERE `article_id`='123'

PS:凡事都是雙刃劍。為了更快的讀我們通常要犧牲一些東西。在讀比較多的表要加快讀的速度,在寫較多的表要加快寫的速度。各自權(quán)衡。在加快讀的速度的時候,我們犧牲的并不僅僅是寫的性能,還有開發(fā)成本,開發(fā)變的更復(fù)雜,維護(hù)成本等。所以并不是讀的速度越快越好,需要找一個平衡點(diǎn)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 隆回县| 通山县| 翁牛特旗| 福海县| 大名县| 正定县| 木兰县| 南华县| 太和县| 温宿县| 屏南县| 成都市| 斗六市| 北宁市| 九江县| 祁门县| 巫山县| 洪湖市| 庆元县| 新化县| 陆良县| 汉中市| 沐川县| 高州市| 额济纳旗| 吉林省| 沅江市| 西乡县| 鄂托克前旗| 思南县| 闵行区| 新龙县| 隆尧县| 临沂市| 田东县| 益阳市| 土默特左旗| 蒲城县| 腾冲县| 宁强县| 揭东县|