1,899   Redis

一,竞态争用

当多个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

Your email address will not be published. Required fields are marked *