php利用redis实现互斥锁机制

知识必备:

1、掌握redis的watch锁机制,文档链接:http://doc.redisfans.com/

一、常量定义类:

defined('WS_REDIS_VALUE') or define('WS_REDIS_VALUE', 'ws'); //ws存储redis键,作用:标识并发情况下ws协议的采集唯一锁机制

defined('AFTER_TIME') or define('AFTER_TIME', '8000'); //ws锁机制回滚延迟时长

二、演示demo

    /**
     * 筛选排队中的并发
     * @Author: 麻破伦意识
     * @Time: 2019/6/25
     * @param array $ids
     */
    protected function startCollection(array $ids)
    {
        $wathNum = self::$reids->get(WS_REDIS_VALUE);
        if (empty($wathNum)) {
            self::$reids->watch(WS_REDIS_VALUE); //利用redis的watch机制
            self::$reids->multi();
            self::$reids->set(WS_REDIS_VALUE, 1);
            self::$reids->exec();
            echo "==============开始执行=============\n";
            $market_model = Market::run();
            //此Timer为swoole的延迟定时处理
            Timer::getInstance()->after(AFTER_TIME, function (){
                self::$reids->set(WS_REDIS_VALUE, 0);
                echo "执行完成~~~~释放锁机制\n";
            });
            $data = $market_model->where(["id"=>["IN",$ids]])->field("id,symbol,update_time")->select();
            array_walk($data, function($item, $io) use ($data){
                if (strtotime($item['update_time']) < (time() - 200)) {
                    $this->execCollection($item['symbol']);
                }
            });
        } else {
            echo "正在执行采集处理----------等待其他程序执行\n";
        }
    }

你可能感兴趣的:(php,redis)