使用Memcached实现加锁功能

<?php
/**
 * 加锁(使用Memcached实现)
 * 备注:加锁结果只有两种情况:加锁成功或加锁失败,而加锁失败的原因只有一个,就是重复加锁。
 *
 * @param string $key 锁标识
 * @param int $expiration 锁有效时间,单位:秒
 * @return bool 加锁结果:true=加锁成功|false=加锁失败
 */
function lock($key, $expiration = 10)
{
    $memcached = new Memcached();
    $memcached->addServer('localhost', 11211);

    return $memcached->add($key, 'A', $expiration);
}

/**
 * 解锁(使用Memcached实现)
 *
 * @param string $key 锁标识
 * @return bool 加锁结果:true=解锁成功|false=解锁失败
 */
function unlock($key)
{
    $memcached = new Memcached();
    $memcached->addServer('localhost', 11211);

    return $memcached->delete($key);
}

$key = 'LOGIN_LOCK_UID_9527'; // 对9527用户进行登录锁定,防止重复登录
$isLock = lock($key, 10);
if ($isLock) { // 加锁成功,可以开始执行业务逻辑
    echo '用户已被锁定,10秒内禁止登录';

    // 检查账号密码合法性,若不合法那么向前端返回错误信息前记得要先解锁
    // TODO...

    // 更新用户最后登录时间、登录IP
    // TODO...

    // 登录逻辑完成,可以执行解锁操作
    // unlock($key);
} else { // 加锁失败(原因:重复加锁)
    // 这里可以直接返回“请勿重复操作”或“您操作太频繁”等错误信息
    // TODO...

    echo '用户暂时无法登录,请稍后再试';
}

Copyright © 2024 码农人生. All Rights Reserved