mysql實現高並發計數器


mysql實現高並發計數器

 

因為在高並發下 set aa=aa+1要進行鎖表 不然會計算錯誤 但是鎖表了 性能就降低了 所以 計數器采用另外一種方案

CREATE TABLE `article_view`(
`article_id` int(11) NOT NULL,
`pond` tinyint(4) NOT NULL COMMENT '池子,就是用來隨機用的',
`view` int(11) NOT NULL,
PRIMARY KEY (`article_id`,`pond`)
)ENGINE=InnoDB;
  INSERT INTO `article_view` (`article_id`, `pond`, `view`) VALUES (123, RAND()*100, 1) ON DUPLICATE KEY UPDATE `view`=`view`+1

 

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

 查詢出來的數據再更新到字段

如果希望減少表的行數,以避免表變得太大,可以寫一個周期執行的任務,合並所有結果到0 號槽,並且刪除所有其他的槽:
UPDATE daily_hit_counter as c
INNER JOIN (
SELECT day, SUM(cnt) AS cnt, MIN(slot) AS mslot
FROM daily_hit_counter
GROUP BY day
) AS x USING(day)
SET c.cnt = IF(c.slot = x.mslot, x.cnt, 0),
c.slot = IF(c.slot = x.mslot, 0, c.slot);

DELETE FROM daily_hit_counter WHERE slot <> 0 AND cnt = 0;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM