1. 程式人生 > >快速生成不重複的卡號

快速生成不重複的卡號

蜘蛛網有很多購物卡,電影優惠券,抵用券。


比如一個需求後臺此刻需要生成新的一批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儲存處理