php redis 乐观锁,Redis 乐观锁

乐观锁大多是以数据版本号来进行成功或者失败!

举个例子:

假设某个文章的点赞数为100,此时的version我们暂定没有异常为100.

当用户A对他进行点赞的时候进行操作,那此时的点赞数为100+1、version=101,提交更新时,由于版本号大于数据库记录的版本号,数据被更新,此时数据记录的version=101。

然而在特殊情况下用户B是和用户A是同时进行操作的,也就是说,他获得的version也是100、点赞数为100,提交结果是点赞数为100+1、version=101,但是此时对数据库的版本发现当前数据记录的version也为101,不满足当前提交版本号大于数据库版本号,所以此时更新操作被驳回。

执行实验代码:

WATCH test value = GET test value = value+1 MULTI SET test value EXEC

由于WATCH 的key会被监视,会校验这个key是否被更改,如果该监视的key 在EXEC执行前被修改了,那么整个事务都会被驳回。

php实现代码

$redis = new redis(); $redis->connect('127.0.0.1', 6379); //获取当前点赞数 $test = $redis->get("test"); $count = 1; //默认每次点赞+1 $redis->watch("test"); $redis->multi(); //设置延迟,方便测试效果。 sleep(5); //插入抢购数据 $redis->set("test",$test+$count); $res = $redis->exec(); if($res){ $new_test = $redis->get("test"); echo "点赞成功当前点赞数为:".$new_test."
"; }else{ echo "点赞失败";exit; }

需要注意的是如果使用同一个浏览器的多个标签页同时访问同一个URL,那么浏览器认为这些不同的请求是同一个人,会对你的每个请求进行排队,不做并发处理。不管Nginx还是Apache,都是在并发处理,只不过你的浏览器自作主张,把你的请求阻塞了。

原文出处:luoio -> http://luoio.com/?p=37

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值