水平分表自增ID解決方案(隊(duì)列)

隊(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());

來(lái)源

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

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

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