在一次尝试中发现了,其实redis也是有延迟的。我的代码思路是这样的:判断某个key是否存在,不存在就标记一个时间点,存在就不标记。我用redis的列表来实现这个功能。
代码如下:
$identifier = 'kevin'; //桶的标识符
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
$seed = $this->microtime_format('Y-m-d H:i:s.x', $this->microtime_float());
$exists = $redis->exists($identifier);
if (!$exists) {
$redis->rpush($identifier, $seed);
}
上面的代码,在用浏览器访问的时候列表中始终只有一条value。这是因为,手动刷新再快也是有时间差的。
然后,我用ab模拟了并发进行了测试
ab -n100 -c10 http://xxxx
和
ab -n100 -c20 http://xxxx
第一次模拟了10个并发,第二次模拟了20个并发。结果得到的数据是一样的。
Array ( [0] => 2017-10-14 10:28:12.8315 [1] => 2017-10-14 10:28:12.8335 [2] => 2017-10-14 10:28:12.8331 [3] => 2017-10-14 10:28:12.8312 [4] => 2017-10-14 10:28:12.8319 [5] => 2017-10-14 10:28:12.8327 )
列表中都是保持6个value。再模拟第二次并发的时候,我是把记录清楚了的,所以,不存在累积的问题。
这说明,redis在判断key是否存在也是有延迟的。只不过延迟比较小,都是微妙级别的。毕竟,redis作为一个服务存在,又是用C编写的,执行肯定是需要时间的。