php memcache实现锁操作 代码实例

来源: 老季博客
日期: 2017-6-30
作者: 腾讯云/服务器VPS推荐评测/Vultr
阅读数: 48

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

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

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

php memcache实现锁操作 代码实例

使用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个请求可以执行。逻辑流程图如下:

php memcache实现锁操作 代码实例

使用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
{
    //告诉用户正在抽奖,请稍后
}
链接到文章: https://jiloc.com/43372.html

发表回复

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