注冊碼問題分析(解決批量插入數(shù)據(jù)庫的問題)

需求描述:

產(chǎn)品狗說要做一個注冊碼生成模塊,生成一批注冊碼,提供給受邀的用戶注冊網(wǎng)站。

需求分析

注冊碼功能并不少見(想去xxx論壇的孩子們天天吵著要注冊碼……),首先我們來簡單分析一下產(chǎn)品狗的這個需求。

產(chǎn)品狗說要做一個注冊碼生成模塊,生成一批注冊碼,提供給受邀的用戶注冊網(wǎng)站

產(chǎn)品狗隨口一句話,里面包含這么多信息:

  • 自動產(chǎn)生注冊碼
  • 每次產(chǎn)生一個注冊碼或者是多個注冊碼(數(shù)量前臺應(yīng)該可以輸入)
  • 注冊碼不能重復(fù)(這個是必須的)
  • 注冊碼得有一個標(biāo)識,已使用或者未使用。

注冊碼表的設(shè)計看上去是這個樣子的:

var _getInviteCode = function () {
    var inviteCodeSchema = new Schema({
        code: {type: String, required: true, unique: true},
        used: {type: Boolean, default: false}
    }, {
        timestamps: {
            createdAt: 'created_at',
            updatedAt: 'updated_at'
        }
    });

    return  mongoose.model('inviteCode', inviteCodeSchema);
};

其實就倆主要字段codeused

需求解決

分析一下注冊碼生成機(jī)制

我總結(jié)了一下主要有以下幾種方案:

  1. 自己定義一個字符池,將允許的符號放到池子里,隨機(jī)取n個字符組成注冊碼。
    缺點(diǎn):自己寫的算法,為了防止不重復(fù),每次需要跟數(shù)據(jù)庫里已有的值進(jìn)行對比,效率慢。
  2. 使用GUID
    缺點(diǎn):字符串較長,占用空間較大,不美觀。
  3. 主鍵或主鍵+隨機(jī)碼的形成
    缺點(diǎn):需要先產(chǎn)生主鍵,而且與數(shù)據(jù)庫類型關(guān)系大,擴(kuò)展性和復(fù)用性較差。
  4. 使用系統(tǒng)日期
    缺點(diǎn):高并發(fā)的時候,可能重復(fù)

目前用的比較多的是第三種方式,衍生出來可以是:將唯一ID映射成base26\base36。
我這里推薦一個項目:https://github.com/dylang/shortid 可以有效快速的生成不重復(fù)的注冊碼(可用于游戲開發(fā))。

解決循環(huán)插入數(shù)據(jù)庫的問題

注冊碼生成方案有了,但是在具體編碼的過程中又遇到了新的問題:如何批量保存一批注冊碼呢

Mongoose本身支持批量插入數(shù)據(jù),所以這個問題很好解決:

router.get('/generate', function (req, res, next) {
    var number = Number(req.query.num);
    var codeArr = new Array();
    for(var i = 0; i< number; i++) {
        codeArr.push({
            code: shortid.generate()
        });
    }

    InviteCode.collection.insert(codeArr, function (err, docs) {
        if(err){
            next(err);
        }else{
            res.redirect('/admin/inviteCode');
        }
    });
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容