隊(duì)列方式
使用隊(duì)列服務(wù),如redis、memcacheq等等,將一定量的ID預(yù)分配在一個(gè)隊(duì)列里,每次插入操作,先從隊(duì)列中獲取一個(gè)ID,若插入失敗的話,將該ID再次添加到隊(duì)列中,同時(shí)監(jiān)控隊(duì)列數(shù)量,當(dāng)小于閥值時(shí),自動(dòng)向隊(duì)列中添加元素。
這種方式可以有規(guī)劃的對(duì)ID進(jìn)行分配,還會(huì)帶來(lái)經(jīng)濟(jì)效應(yīng),比如QQ號(hào)碼,各種靚號(hào),明碼標(biāo)價(jià)。如網(wǎng)站的userid, 允許uid登陸,推出各種靚號(hào),明碼標(biāo)價(jià),對(duì)于普通的ID打亂后再隨機(jī)分配。
<?php
class common
{
private $r;
function construct()
{
$this->__construct();
}
public function __construct()
{
$this->r = new Redis();
$this->r->connect('127.0.0.1', 6379);
}
function set_queue_id($ids)
{
if (is_array($ids) && isset($ids)) {
foreach ($ids as $id) {
$this->r->LPUSH('next_autoincrement', $id);
}
}
}
function get_next_autoincrement()
{
return $this->r->LPOP('next_autoincrement');
}
}
$createid = array();
while (count($createid) < 20) {
$num = rand(1000, 4000);
if (!in_array($num, $createid)) {
$createid[] = $num;
}
}
$id = new common();
$id->set_queue_id($createid);
var_dump($id->get_next_autoincrement());