溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用redis制作投票系統(tǒng)的計(jì)數(shù)器

發(fā)布時(shí)間:2020-05-19 14:47:42 來(lái)源:億速云 閱讀:278 作者:Leah 欄目:關(guān)系型數(shù)據(jù)庫(kù)

這篇文章主要為大家詳細(xì)介紹了如何使用redis制作投票系統(tǒng)的計(jì)數(shù)器,文中示例代碼介紹的非常詳細(xì),零基礎(chǔ)也能參考此文章,感興趣的小伙伴們可以參考一下。

校驗(yàn)

首先,要對(duì)每個(gè)用戶的投票數(shù)進(jìn)行校驗(yàn)。用戶每天都有3次投票機(jī)會(huì),所以,我們可建立個(gè)鍵,將他的有效期設(shè)為明天凌晨。用戶每投一票就加1等到了3票后,就提示今日次數(shù)已用完。

// 投票次數(shù)校驗(yàn)
function checkVote($uid)
{
    $key = "uid:$uid:cnt";
    $tomrTime = mktime(0,0,0, date('m'), date('d')+1, date('Y'));
    
    if (!$redis->exsits($key)) {
        $redis->set($key, 0, ['ex' => $tomrTime - time()]);
        return true;
    } else if ( ($cnt = $redis->get($key)) < 3 ) {
        return true;
    } else {
        return false;
    }
}

統(tǒng)計(jì)投票

次數(shù)校驗(yàn)通過(guò)后,就需要統(tǒng)計(jì)用戶的得票數(shù)了。

// 得票數(shù)計(jì)數(shù)
// uid表示投票人id
// touid表示得票人id
function vote ($uid, $toUid)
{
    $key = "uid:$toUid:vote";
    
    // 投票數(shù)校驗(yàn)
    if (checkVote($uid)) {
        // 統(tǒng)計(jì)投票數(shù)及參選人得票數(shù)
        $redis->incr($key);
        $redis->incr("uid:$uid:cnt");
        
        return true;
    } else {
        return false;
    }
}

我自己的阿里云主機(jī)配置只有1核cpu1G內(nèi)存的配置,每秒incr性能能達(dá)到10萬(wàn)多次,redis性能真恐怖。

# redis-benchmark -t incr -q
INCR: 105708.25 requests per second

Mysql異步更新用戶得票數(shù)

最后,我們只需要做一個(gè)定時(shí)任務(wù)了,讓mysql每隔一定時(shí)間就去同步用戶的得票數(shù)。

方法是做一個(gè)死循環(huán),每次循環(huán)都獲取50個(gè)用戶得票數(shù),直到遍歷完所有用戶后,就退出循環(huán),結(jié)束腳本。

$start = 0;
while (true) {
    // 每次循環(huán)取50個(gè)用戶id
    $users = $DB->query("SELECT uid,votes FROM users LIMIT $start, 50");
    if (!$users) {
        exit();
    }
    $keys = [];
    foreach ($users as $userinfo) {
        $keys[] = "uid:{$userinfo['uid']}:vote";
    }
    $votes = $redis->mget($keys);
    foreach ($votes as $index => $vote) {
        if ($vote != $users[$index]['votes']) {
            $DB->query("UPDATE users SET votes = '$vote' WHERE uid='{$users[$index]['uid']}");
        }
    }
    $start += 50;
}

Redis的mget命令的是一次獲取多個(gè)key的值。獲取了redis里存放的redis得票數(shù)后,要先和Mysql里的得票數(shù)做比對(duì)。不一樣的時(shí)候才去更新Mysql的數(shù)據(jù)。

看完上述內(nèi)容,你們掌握使用redis制作投票系統(tǒng)的計(jì)數(shù)器的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI