多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
百度百科的解释:具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。 ```php <?php /** * redis实战 * * 实现悲观锁机制 * * @author TIGERB <https://github.com/TIGERB> * @example php pessmistic-lock.php */ $timeout = 5000; $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); do { $microtime = microtime(true) * 1000; $microtimeout = $microtime+$timeout+1; // 上锁 $isLock = $redis->setnx('lock.count', $microtimeout); if (!$isLock) { $getTime = $redis->get('lock.count'); if ($getTime > $microtime) { // 睡眠 降低抢锁频率 缓解redis压力 usleep(5000); // 未超时继续等待 continue; } // 超时,抢锁,可能有几毫秒级时间差可忽略 $previousTime = $redis->getset('lock.count', $microtimeout); if ((int)$previousTime < $microtime) { break; } } } while (!$isLock); $count = $redis->get('count')? : 0; // file_put_contents('/var/log/count.log.1', ($count+1)); // 业务逻辑 echo "执行count加1操作~ \n\n"; $redis->set('count', $count+1); // 删除锁 $redis->del('lock.count'); // 打印count值 $count = $redis->get('count'); echo "count值为:$count \n"; ```