定义port为随机五位数,然后向表中插入数据,其中port是唯一值, 由于表中已经存在大量记录,提交后经常出现重复的错误提示,如何解决
$port=rand(10000,54999);
$con = mysqli_connect("sever","user","passwd");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysqli_query($con,"INSERT INTO dbdb
.list
(port
, wechat
) VALUES ( '".$port."', 'wechat') or die(mysqli_error($con));
mysqli_close($con);
<?php
$con = mysqli_connect("sever","user","passwd");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
function create_code(){//生成唯一5位数
global $con;
mt_srand((double)microtime() * 1000000);//用 seed 来给随机数发生器播种。
$port=mt_rand(10000,54999);
$query =mysqli_query($con,"select * from dbdb.list where port='".$port."'");
$rt =mysqli_fetch_array($query,MYSQLI_ASSOC);
if($rt){//判断随机数是否存在,存在就重新生成,直到不存在为止
$port=create_code();
}
return $port;
}
$port=create_code();
mysqli_query($con,"INSERT INTO dbdb.list (port, wechat) VALUES ( '".$port."', 'wechat')") or die(mysqli_error($con));
mysqli_close($con);
?>
简单的一个例子
这个可以使用批量生成唯一值,然后取并集,然后再取余集,可以快速完成大量的port的生成,集合的操作比一个一个mysql的判断要快,这个随机的port可以先存在某个临时缓存中,然后再操作
1.用自增发(肯定不符合你的)
2,再redis 批量生产 10000 - 54999 数字 放入 无须zet 中,然后随机读取
redis> SADD myset "100000"
(integer) 1
redis> SADD myset "10001"
(integer)
。。。
redis> SADD myset "54999 "
(integer) 1
redis> SPOP myset
"10101"
redis> SPOP myset 3
replace into 。给port unique索引 相同的记录,则先删除掉。再插入新记录
insert前先查询生成的port是否存在,存在的话重新生成,直到不存在以后再insert
// 自动生成随机用户名
// 测试,循环创建25万个随机账号,0碰撞,足够应付未来数十亿级PV
function genUserName()
{
$microtime = substr(microtime(true), strpos(microtime(true), ".") + 1);
$chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$username = "";
for ($i = 0; $i < 6; $i++) {
$username .= $chars[mt_rand(0, strlen($chars))];
}
return $microtime . strtoupper(base_convert(time() - 1420070400, 10, 36)) . $username;
}