唯一随机码解读----laravel5

1.需求

用户购买商品, 给用户提供一个核销码, 用户凭核销码到店铺核销使用
核销码要求类似美团核销码,16位纯数字

2.问题

如何避免核销码重复

3.思考

方式1: 存数据表的递增属性,
缺点: 若用户掌握规律, 存在刷码的情况,不可取

方式2: 在数据表中存放随机核销码, 每次在表中查询唯一性
缺点: 若并发高, 每次查询数据库存在性能差,不可取

方式3: 使用uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。
缺点: 大并发的情况下存在重复核销码的情况

方式4: 基于方式3的方式生成10000个核销码放入缓存中, 每个核销码标记个使用状态,使用的核销码状态标记为已使用,更新缓存; 用完之后重新调用方式3的方式重新生成10000个核销码放入缓存中,如此递归......

4.实践

function create_code_sn(){
    $key = date('Ymd');
    if(Cache::has($key)){
        $codes = Cache::get($key);
    }else{
        $codes = [];
        for ($i=0;$i<10000;$i++){
            $codes[] = [
                'code' => date('Ymd') . substr(implode(null, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), -8),
                'used' => false
            ];
        }
        //去重复
        $codes = collect($codes)->unique('code')->values()->all();
    }
    //取出当前的数据
    foreach ($codes as $k=>$code){
        if(!$code['used']){
            $codes[$k]['used'] = true;
            $codeSn = $code['code'];
            break;
        }
    }
    //缓存数据,缓存一天时间
    Cache::put($key,$codes,1440);
    if(isset($codeSn)){
        return $codeSn;
    }else{
        Cache::flush();
        return create_code_sn();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,446评论 25 708
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • >>>HALF-PROFILE 记住我的名字:于悦儿(童年的名字) 可以描绘我的大致性格:狮子尾巴处女头发丝(挺喜...
    Braven阅读 199评论 0 0
  • 走在时代前面的明白人,永远是小部分。他们理解世界的趋势,了解科技的力量,有更加成熟的心智模式、更开放的心态和更快的...
    时间很宝贵阅读 177评论 0 0