为了账号安全,请及时绑定邮箱和手机立即绑定

mysql高并发时候投票问题 如何优化

mysql高并发时候投票问题 如何优化

繁星点点滴滴 2018-06-25 15:38:50
比如一万人给一个人投票我的做法是先是读取票数然后在票数+1但是一万人同时投票的话 获取票数和更新肯定获取的不对代码如下 用的是phpcms 请问大神该怎么优化 代码就这么点 结构简单的 就是投票人比较多//根据ID获取票数 $r = $db->get_one(array('id' => intval($_GET['id']))); //票数累计并更新票数 $num = $r['num'] + 1; $sql = array('num' => $num); $db->update($sql, array('id' => intval($_GET['id'])));
查看完整描述

4 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

诚邀。

如果你不想或者不愿意将redis引入到phpcms中。
我没有对phpcms进行过二次开发,但是你可以在sql中直接进行相加,并非使用代码去实现相加

update student set score=score+1 where id = 1

这样就避免了投票不准确
如果有时间可以使用redis或者队列去实现这个功能。


查看完整回答
反对 回复 2018-07-18
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

如果只是保证数据正常, 那可以事务加排它锁来搞.

按理说会先存到redis里面, 投票结束了才写入数据库


查看完整回答
反对 回复 2018-07-18
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

简单点就直接MySQL上锁,但是这样性能会低很多。
可以利用redis,读也从redis读,更新也是更新redis里(incr操作),
开个任务等到投票结束,把缓存中投票数写入到MySQL中。

查看完整回答
反对 回复 2018-07-18
?
森栏

TA贡献1810条经验 获得超5个赞

看你的并发有多高、服务器性能有多好了。
简单来讲,有几点可以处理你的问题。

  1. 使用redis列表记录每个人的投票,异步去处理数据库。

  2. 数据库加锁,不过在高并发(如只有一台低档服务器+一万个人3s内同时访问)时能不能扛得住要看信仰。

  3. 优化你的表设计,这张表尽量简单一些,选择适当的事务隔离级别。

  4. 服务器物理机换成硬盘读写性能更优的。


查看完整回答
反对 回复 2018-07-18
  • 4 回答
  • 0 关注
  • 328 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信