我知道redis的单个操作是原子性的,如果在代码中对redis进行多次操作将无法保证整个操作流程的原子性。
比如下面的这段代码中,假设nums这个key的值是50,使用ab.exe工具对其1000次访问,并发数是100,理论上结果应该会出现负数的.
可是我多次测试下nums的值都是1,请问是我测试的方式不对还是其他哪里有问题呢?
$nums = $redis->get('nums');
if($nums > 1)
$redis->decr('nums');
我知道redis的单个操作是原子性的,如果在代码中对redis进行多次操作将无法保证整个操作流程的原子性。
比如下面的这段代码中,假设nums这个key的值是50,使用ab.exe工具对其1000次访问,并发数是100,理论上结果应该会出现负数的.
可是我多次测试下nums的值都是1,请问是我测试的方式不对还是其他哪里有问题呢?
$nums = $redis->get('nums');
if($nums > 1)
$redis->decr('nums');
你这样的并发很难测试出来的,的确这样操作存在负数的可能。但是想想你的电脑是 4核8线程,最多同时执行8个请求而已,这对redis来说是非常小的并发量了。所以我认为不出现问题是因为并发量小了,实际上是会存在问题的。
1 回答4k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
1 回答1.9k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.2k 阅读
不知道ab.exe测试时什么原理,你自己写一个多线程调用下就知道了会产生负数值的。
输出结果出现负值。