这篇文章主要为大家详细介绍了如何使用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每隔一定时间就去同步用户的得票数。
方法是做一个死循环,每次循环都获取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制作投票系统的计数器的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程之家行业资讯频道,感谢各位的阅读!