明月笑刀無情
2018-07-18 14:44:31
比如一萬人給一個人投票我的做法是先是讀取票數然后在票數+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'])));
5 回答

慕村9548890
TA貢獻1884條經驗 獲得超4個贊
如果你不想或者不愿意將redis引入到phpcms中。
我沒有對phpcms進行過二次開發,但是你可以在sql中直接進行相加,并非使用代碼去實現相加
update student set score=score+1 where id = 1
這樣就避免了投票不準確
如果有時間可以使用redis或者隊列去實現這個功能。

慕娘9325324
TA貢獻1783條經驗 獲得超4個贊
簡單點就直接MySQL上鎖,但是這樣性能會低很多。
可以利用redis,讀也從redis讀,更新也是更新redis里(incr操作),
開個任務等到投票結束,把緩存中投票數寫入到MySQL中。

Cats萌萌
TA貢獻1805條經驗 獲得超9個贊
這其實是涉及到隊列控制,鎖的一個應用。即,當一個用戶寫的時候,將其先鎖起來,不給其它人控制數據,直到一個修改完成,然后才到下一個人進行修改。
可以對 數據鎖 或者 數據隊列 查找下相關文章進行了解。具體實現可以通過臨時表進行隊列排序,逐個處理。當然,如果處理高并發數據,一般都會用牛刀諸如 redis 等數據庫進行主從數據處理會比較好。

繁星點點滴滴
TA貢獻1803條經驗 獲得超3個贊
看你的并發有多高、服務器性能有多好了。
簡單來講,有幾點可以處理你的問題。
使用
redis
列表記錄每個人的投票,異步去處理數據庫。數據庫加鎖,不過在高并發(如只有一臺低檔服務器+一萬個人
3s
內同時訪問)時能不能扛得住要看信仰。優化你的表設計,這張表盡量簡單一些,選擇適當的事務隔離級別。
服務器物理機換成硬盤讀寫性能更優的。
- 5 回答
- 0 關注
- 811 瀏覽
添加回答
舉報
0/150
提交
取消