乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。<br><br><?phpheader('content-type:text/html;chaeset=utf-8');/** * redis实战 * * 实现乐观锁机制 * * @example php optimistic-lock.php */$redis = new \Redis();$redis->connect('127.0.0.1', 6379);*注意:这里还要注意的是,WATCH命令是不可以在事务里面使用的,也就是说,必须用在Multi命令之前,而且事务只会在提交时发生阻塞,命令入队一半不会阻塞,所以在提交之前,其他客户端是可以对任意键值对操作的,所以就会发生事务不安全,因为事务里已经不满足一致性和隔离性了
// 监视 count 值
$redis->watch('count');// 开启事务$redis->multi();// 操作count$time = time();$redis->set('count', $time);//-------------------------------/** * 模拟并发下其他进程进行set count操作 请执行下面操作 * * redis-cli 执行 $redis->set('count', 'is simulate'); 模拟其他终端 */sleep(10);//-------------------------------// 提交事务$res = $redis->exec();if ($res) { // 成功... echo 'success:' . $time; return;}// 失败...(exec 时会检测watch 的值,是否改变;如果改变了就会执行失败)
echo 'fail:' . $time;
