a.php代码如下:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$a = $redis->get('a');
$redis->watch('a');
sleep(10);
$ret = $redis->multi()->incr('a')->exec();
var_dump($ret);
var_dump($a);

b.php代码如下:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->set('a', '1');
$a = $redis->get('a');
var_dump($a);

c.php代码如下:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$a = $redis->get('a');
var_dump($a);

先执行a.php,结果如下:

redis的事务处理_广告点击控制

此时a的值为2

再执行a.php,三秒后执行b.php(将a的值变为1),执行结果如下图:

redis的事务处理_广告点击控制_02

再过七秒后,可以看到a.php的执行结果失败,如下图:

redis的事务处理_广告点击控制_03

然后执行c.php查看最后结果,如下图:

redis的事务处理_广告点击控制_04


通过redis的事务处理,可以实现广告点击数的控制,避免多个客户端同时自增点击数,造成点击数跑超。