广告
返回顶部
首页 > 资讯 > 数据库 >如何使用redis制作投票系统的计数器
  • 768
分享到

如何使用redis制作投票系统的计数器

2024-04-02 19:04:59 768人浏览 安东尼
摘要

这篇文章主要为大家详细介绍了如何使用Redis制作投票系统的计数器,文中示例代码介绍的非常详细,零基础也能参考此文章,感兴趣的小伙伴们可以参考一下。校验首先,要对每个用户的投票数进行校验。用户每天都有3次投

这篇文章主要为大家详细介绍了如何使用Redis制作投票系统的计数器,文中示例代码介绍的非常详细,零基础也能参考此文章,感兴趣的小伙伴们可以参考一下。

校验

首先,要对每个用户的投票数进行校验。用户每天都有3次投票机会,所以,我们可建立个键,将他的有效期设为明天凌晨。用户每投一票就加1等到了3票后,就提示今日次数已用完。

// 投票次数校验
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;
    }
}

统计投票

次数校验通过后,就需要统计用户的得票数了。

// 得票数计数
// uid表示投票人id
// touid表示得票人id
function vote ($uid, $toUid)
{
    $key = "uid:$toUid:vote";
    
    // 投票数校验
    if (checkVote($uid)) {
        // 统计投票数及参选人得票数
        $redis->incr($key);
        $redis->incr("uid:$uid:cnt");
        
        return true;
    } else {
        return false;
    }
}

我自己的阿里云主机配置只有1核cpu1G内存的配置,每秒incr性能能达到10万多次,redis性能真恐怖。

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

Mysql异步更新用户得票数

最后,我们只需要做一个定时任务了,让Mysql每隔一定时间就去同步用户的得票数。

方法是做一个死循环,每次循环都获取50个用户得票数,直到遍历完所有用户后,就退出循环,结束脚本。

$start = 0;
while (true) {
    // 每次循环取50个用户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命令的是一次获取多个key的值。获取了redis里存放的redis得票数后,要先和mysql里的得票数做比对。不一样的时候才去更新Mysql的数据。

看完上述内容,你们掌握使用redis制作投票系统的计数器的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: 如何使用redis制作投票系统的计数器

本文链接: https://www.lsjlt.com/news/34778.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作