php redis加锁解锁

 PHP进阶  2021-06-24  admin  1127  1521

php redis加锁解锁

<?php


namespace App\Shop\SecKill;

/**
 * Class RedisLockService redis 锁服务
 * @author code.cent123.com
 */
class RedisLockService
{
    /**
     * redis锁key
     */
    const REDIS_LOCK_KEY_TEMPLATE = 'LOCKING_KEY_';

    /**
     * redis锁默认超时时间(秒)
     */
    const REDIS_LOCK_DEFAULT_EXPIRE_TIME = 3600;


    /**
     * 加redis锁
     * @param string $strLockKey
     * @param int $intExpireTime 锁过期时间(秒)
     * @return bool|string 加锁成功返回唯一锁ID,加锁失败返回false
     */
    public static function addLock(string $strLockKey, int $intExpireTime = self::REDIS_LOCK_DEFAULT_EXPIRE_TIME)
    {

        if (empty($strLockKey) || $intExpireTime <= 0) {
            return false;
        }

        //获取Redis连接
        $objRedisConn = redis();
        //生成唯一锁ID,解锁需持有此ID
        $uniqueLockId = self::generateUniqueLockId();
        $redisKey = self::REDIS_LOCK_KEY_TEMPLATE . $strLockKey;
        $bolRes = $objRedisConn->set($redisKey, $uniqueLockId, ['nx', 'ex' => $intExpireTime]);

        return $bolRes ? (string)$uniqueLockId : false;
    }

    /**
     * 解redis锁
     * @param string $strLockKey
     * @param string $uniqueLockId
     * @return bool
     */
    public static function unLock(string $strLockKey, string $uniqueLockId): bool
    {

        if (empty($strLockKey) || empty($uniqueLockId)) {
            return false;
        }

        $objRedisConn = redis();
        $redisKey = self::REDIS_LOCK_KEY_TEMPLATE . $strLockKey;;

        //监听Redis key防止在比对lock_id与解锁事务执行过程中被修改或删除,提交事务后会自动取消监控,其他情况需手动解除监控
        $objRedisConn->watch($redisKey);
        if ($uniqueLockId == $objRedisConn->get($redisKey)) {
            $objRedisConn->multi()->del($redisKey)->exec();
            return true;
        }
        $objRedisConn->unwatch();

        return false;
    }

    /**
     * 生成锁唯一ID
     * @return string
     */
    public static function generateUniqueLockId(): string
    {
        return date('Ymd_His') . uniqid('_uniqid_');
        //return redis()->incr('LOCK_UNIQUE_ID');
    }
}

使用示例:

//获取锁
$lock_id = RedisLockService::addLock($redis_key, 10);
if (empty($lock_id)) {
    $res = [
        'status' => 0,
        'msg' => '锁定中...',
        'date' => date('Y-m-d H:i:s'),
    ];
    return $res;
}

//业务逻辑 do something ... 

//删除锁
RedisLockService::unLock($redis_key, $lock_id);


如果文章对您有帮助,点击下方的广告,支持一下作者吧!

转载必须注明出处:

php redis加锁解锁 —— code.cent123.com

相关推荐


Systemd Web 管理系统:简化服务管理

# Systemd Web Systemd Web 是一个 Systemd 的 Web UI 管理系统,通过直观的界面和易用的操作,让用户能够轻松地管理 Linux 系统和服务。该项目旨在简化 Systemd 的使用,使得无论是专业的系统管理员还是普通的用户,都能够方便地对系统进行操作。 ## [github地址] (https://github.com/topascend/systemd

php redis 分布式锁

Redis 分布式锁是一种使用 Redis 数据库来实现的同步机制,用于在分布式系统中保证多个进程或线程对共享资源的互斥访问。Redis 分布式锁的基本原理是使用 Redis 的 SETNX 命令来尝试设置一个键,如果这个键不存在,那么获取锁成功,否则获取锁失败。获取锁成功后,需要设置锁的过期时间,以防止锁被永久占用。释放锁时,需要删除这个键。Redis 分布式锁有一些优点和缺点:优点:Redis

封装 laravel 的公共队列,延迟处理任务

封装 laravel 的公共队列,延迟处理任务&lt;?php /** *ThisfileispartofLunanShopTeam. *http://code.cent123.com/ *@authorhttp://code.cent123.com/view/387 */ namespaceApp\Jobs; useException; useIlluminate\B

php 秒杀活动逻辑

php 秒杀活动逻辑