• 用memcached实现的php锁机制


     <?php
    /**
     * 使用Memcache实现给进程加锁的类
     *
     * Copyright (C) 2013 JeffJing
     *
     * 一些时候需要让系统的某些操作串行化,这个时候就要对这些操作来加上一把锁。 好比你去上厕所, 你要先推厕所门看能否进去,进去的话上锁,其他人就进不来了, 等你拉完粑粑之后把锁打开,这样的话就保证了厕所永远只有1个人, 上厕所的过程是串行化的, 同时只有1个人上。
     * 网上的一些解决方案大多是使用文件的, 我就纳闷了,加锁的时候创建一个文件, 解锁的时候把文件删掉。
     * 我就纳闷: Why not memcached ? 而memcached的add操作专门是为这种并发的场景而生的, 当key不存在的时候会创建一个key,存在的话返回false. 顺手写了这么一个 , 希望对大家"拉粑粑"的这种操作有所帮助
     *
     * 举个栗子:
     *     $key = '厕锁1号坑';
     *     if(MemLock::addLoack($key)) {
     *         //拉粑粑喽,pu~pu~~~~~
     *         MemLock::releaseLock($key);
     *     } else {
     *         //不好意思, 厕所有人啦!!
     *     }
     *
     */
    class MemLock {
        private static $memcache = null;
    
        /**
         * 获取memcached连接
         *
         * @return Memcached
         */
        public static function getConnection() {
            if (! isset ( self::$memcache )) {
                self::$memcache = new Memcache ();
                self::$memcache->connect ( '127.0.0.1', 11211 );
            }
            return self::$memcache;
        }
    
        /**
         * 加锁
         *
         * @param $key 锁关键字
         * @param $expireTime   超时时间, 当进程在锁定后出错,这样永远不会释放锁了,只能等到缓存失效
         *
         * @return boolean true 成功获取到锁 false 获取锁失败
         */
        public static function addLock($key, $expireTime = 120) {
            $memcache = self::getConnection ();
    
            if($memcache->add($key, 1, false, $expireTime)) {
                return true;
            }
            return false;
        }
    
        /**
         * 释放锁
         *
         * @param $key 锁关键字
         *
         * @return boolean true 释放成功 false 释放失败
         */
        public static function releaseLock($key) {
            $memcache = self::getConnection ();
            return $memcache->delete ( $key );
        }

    原文地址:小景的博客

  • 相关阅读:
    datatable转mode方法
    UVA10652 Board Wrapping (二维凸包+多边形面积)
    洛谷P3175 [HAOI2015]按位或 (min-max容斥 + 高维前缀和)
    icpc2020沈阳 M (fwt+高维前缀和)
    icpc2019 香港 H. Hold the Line (离线+线段树+单调队列)
    icpc2019 香港 C. Constructing Ranches (点分治)
    点分治模板
    slope trick 待填
    codeforces 713 C. Sonya and Problem Wihtout a Legend (dp(n^2)/slope trick (nlogn))
    icpc2020澳门 I. Nim Cheater (轻重链剖分优化dp空间复杂度)
  • 原文地址:https://www.cnblogs.com/Dong-Ge/p/9166248.html
Copyright © 2020-2023  润新知