php memcache实现锁操作 代码实例

程序中的锁,可以独占某个资源(内存、文件),目的是为了保证数据的一致性。在web程序中,同样需要所去保证数据一致性的问题。

举个例子,一个抽奖程序,首先判断A是否有进行抽奖,如果没有,则进行抽奖,并且把记录insert到数据库中。逻辑很简单,但是在高并发的情况下,极有可能导致重复抽奖的情况。假如,Q1和Q2,这2个请求相隔时间非常短,当Q1先判断了没有进行抽奖,但还未把抽奖记录insert到数据库中的时候,Q2查询数据库,并判断为没有抽奖,并继续执行抽奖的逻辑,而不是告诉用户已经抽奖了。最终结论是导致用户可以抽奖2次,显然不符合我们的需求。

这时候,就需要应用到锁,去确保抽奖这个行为,只有1个请求可以执行。逻辑流程图如下:

使用memcached的add方法

::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
{
    //告诉用户正在抽奖,请稍后
}

搬瓦工年付$28CN2高速线路,512M内存/500G流量/1G带宽,电信联通优化,延迟低,速度快,建站稳定,搬瓦工BandwagonHost VPS优惠BWH26FXH3HIQ点击购买】!

Vultr月付$3.5日本节点,512M内存/500G流量/1G带宽,电信联通优化,延迟低,速度快【点击购买】!

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Scroll Up