一,竞态争用
当多个Redis客户端同时读取Redis服务端中的stock_number值,确实都为1;
然后Redis客户端同时减少Redis服务端中的stock_number,可能会造成stock_number出现负数,即stock_number减少了好几次;
这种情况经常出现在高并发的抢购活动中,后端采用了集群分发,多个Redis客户端操作Redis服务器端,商品库存容易出现超买的问题。
二,Redis的watch机制解决了多个客户端的竞态争用的问题
watch机制对键值进行监控,当被其他客户端改变时,当前的客户端的所有操作将会失败,抛出错误信息。
示例代码如下:
// 监控的键名 $my_key = 'stock_number'; // 使用watch机制 $redis->watch($my_key); $stock_number = $redis->get($my_key); if($stock_number > 0){ // 标志事物开始 $redis->multi(); // 把事物操作放入队列 $redis->decr($stock_number); // 执行所有事物操作 $rtn = redis->exec(); // 释放键名 $redis->unwatch(); // 判断事物操作是否成功 if($rtn == FALSE){ echo 'failed'; }else{ echo 'success' } }
Leave a Reply