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;
