redis乐观锁
1.事务
本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行过程中,都会按照顺序执行!
Redis的事务 |
---|
开启事务(multi) |
命令入队(所有命令…) |
执行事务(EXEC) |
2.乐观锁
- 很乐观,认为什么时候都不会出问题,所以不会上锁!更新数据的时候去判断一下,在此期间是否有人修改过这个数据,MySql中添加version 字段进行比对!
- 获取version
- 更新的时候比较versio
3.watch监听
客户端A | 客户端B |
---|---|
监听sales | 改变sales |
事务期间发现数据发生改变,执行失败 |
通过 WATCH 命令在事务执行之前监控了多个 Keys,倘若在 WATCH 之后有任何 Key 的值发生变化,EXEC 命令执行的事务都将被放弃,同时返回 Nullmulti-bulk 应答以通知调用者事务执行失败
4.乐观锁实现
<?php
$redis = new redis();
$redis->connect("127.0.0.1", 6379);
$redis->watch('count'); //监听count销售量
$count=$redis->get('count');
$num=3;//库存
if($count>=$num){
exit("活动结束");
}
$redis->multi();//开启事务不执行,将命令放入队列中
$redis->incr('count',1);//销售量加1
sleep(1);
$res = $redis->exec();//将命令按顺序执行,如果发现数据被修改,那么命令不执行
if ($res) {
// 成功...
echo 'success:' .time();
return;
}
// 失败...
echo 'fail:' .time();