快速生成不重複的卡號
阿新 • • 發佈:2019-01-02
蜘蛛網有很多購物卡,電影優惠券,抵用券。
比如一個需求後臺此刻需要生成新的一批10萬條卡號,3萬給微信渠道,5萬主站,app,2萬外部渠道發放。
那麼如何快速生成卡號,而且不重複呢?
邏輯很簡單,就是通過某種方法生成一個隨機的卡號,然後去資料庫排重,不重複就插入,直到10萬條。
1、什麼方法生成卡號呢?
不同的業務型別可以區分,抵用券的用DY開頭,兌換券用DH開頭,這樣做是為了查詢重複時候加速,你還可以繼續加維度
2、怎麼生成,保證速度?
一開始只想到怎麼生成卡號資料,能避免查詢重複,結果卡的長度不太可能短,體驗不好。
後來經同事一提醒,儲存過程,那就寫儲存過程。
儲存過程結果也是比較慢,1000條大約33s。然後又問那個同事,批量。我想起來mysql的批量
set autocommit=0;
CREATE TABLE `biz_card` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`cardno` varchar(50) DEFAULT NULL,
`status` tinyint(4) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `ix_cardno` (`cardno`)
) ENGINE=InnoDB AUTO_INCREMENT=7303 DEFAULT CHARSET=utf8;
DROP PROCEDURE IF EXISTS `genCardNo`; CREATE PROCEDURE genCardNo(IN num int) begin -- 產生一個隨機7位數 DECLARE newCard int; set autocommit=0; while num>0 do SET newCard=FLOOR(10000000+ (RAND() * 89999999)); select @repCount:=count(id) from biz_card where cardno=CONCAT('DY',newCard); -- 重複判斷 if @repCount>0 THEN SELECT concat('the value is repeat:', 'DY',newCard); else insert biz_card(cardno,status)values(CONCAT('DY',newCard),0); set num = num - 1; if num%5000=0 then SELECT concat('begin commit,num:',num); commit; end if; end if; end WHILE; commit; end; [SQL] call genCardNo(1000); 受影響的行: 1 時間: 0.3s
[SQL] call genCardNo(100000);
受影響的行: 0
時間: 15.350s
這樣好像可以了。如果資料量再大呢,接下來我的想法是通過訊息佇列分發到不同機器上去生成,排重採用redis儲存處理