您的购物车目前是空的!
程序中的锁,可以独占某个资源(内存、文件),目的是为了保证数据的一致性。在web程序中,同样需要所去保证数据一致性的问题。
举个例子,一个抽奖程序,首先判断A是否有进行抽奖,如果没有,则进行抽奖,并且把记录insert到数据库中。逻辑很简单,但是在高并发的情况下,极有可能导致重复抽奖的情况。假如,Q1和Q2,这2个请求相隔时间非常短,当Q1先判断了没有进行抽奖,但还未把抽奖记录insert到数据库中的时候,Q2查询数据库,并判断为没有抽奖,并继续执行抽奖的逻辑,而不是告诉用户已经抽奖了。最终结论是导致用户可以抽奖2次,显然不符合我们的需求。
这时候,就需要应用到锁,去确保抽奖这个行为,只有1个请求可以执行。逻辑流程图如下:
使用memcached的add方法
Memcached::add — 向一个新的key下面增加一个元素
public bool Memcached::add ( string $key , mixed $value [, int $expiration ] )
成功时返回 TRUE, 或者在失败时返回 FALSE。 如果key已经存在,Memcached::getResultCode()方法将会返回Memcached::RES_NOTSTORED。
程序中的锁,可以独占某个资源(内存、文件),目的是为了保证数据的一致性。在web程序中,同样需要所去保证数据一致性的问题。
举个例子,一个抽奖程序,首先判断A是否有进行抽奖,如果没有,则进行抽奖,并且把记录insert到数据库中。逻辑很简单,但是在高并发的情况下,极有可能导致重复抽奖的情况。假如,Q1和Q2,这2个请求相隔时间非常短,当Q1先判断了没有进行抽奖,但还未把抽奖记录insert到数据库中的时候,Q2查询数据库,并判断为没有抽奖,并继续执行抽奖的逻辑,而不是告诉用户已经抽奖了。最终结论是导致用户可以抽奖2次,显然不符合我们的需求。
这时候,就需要应用到锁,去确保抽奖这个行为,只有1个请求可以执行。逻辑流程图如下:
使用memcached的add方法
Memcached::add — 向一个新的key下面增加一个元素
public bool Memcached::add ( string $key , mixed $value [, int $expiration ] )
成功时返回 TRUE, 或者在失败时返回 FALSE。 如果key已经存在,Memcached::getResultCode()方法将会返回Memcached::RES_NOTSTORED。
if($mc->add($key,$value)) { //执行抽奖逻辑 //逻辑结束后,删除锁 $mc->delete($key); //更新到数据库 } else { //告诉用户正在抽奖,请稍后 }