作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个问题,我现在在一个在线游戏中工作,例如,如果用户以 5 美元的价格购买产品,则价格上涨并且该用户是新所有者,然后下一个用户可以从当前所有者那里以 6 美元的价格购买它...这种情况每秒都会发生很多次。为了避免不止一个用户同时购买产品,我添加了一个 redis 标志,例如:
buyAction($product_id,...){
$lock_id = "buy_".$product_id;
$is_locked = Predis_Interface::get($lock_id);
if($is_locked) {
die();
} else {
Predis_Interface::set($lock_id, true);
}
...
// add it to a worker query...
// if the worker query is finished with this product, it set the lock_id to false
// Predis_Interface::set($lock_id, false)
}
但问题是,有时会有不止一个用户以 5 美元的价格购买同一产品。因此,两个买家都少了 5 美元,但只有一个买家有产品...
我希望有人能帮我解决这个问题。
最佳答案
谢谢伊塔马尔,
你的回答帮助我找到了解决方案,我现在使用:
$lock_id = "buy_".$product_id;
if (!$redis->setnx($lock_id, true)) {
die();
}
这修复了设置和读取之间的间隔,并且只有在设置成功时才返回 true。
然后在查询工作器上,我将其删除:
$lock_id = "buy_".$product_id;
$redis->del($lock_id)
关于PHP, Redis, 锁产品,涨价后解锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27092503/
我是一名优秀的程序员,十分优秀!