//模拟并发list重复问题
public function test() {
$r = new r('api');
$r_key = 'test_zp';
//增加锁key
$r_key_lock = $r_key . '_lock';
echo 'start' . time();
if (!$r->EXISTS($r_key)) {
//todo 模拟执行sql
$data = [1 ,2,3];
echo 'sleep' . time();
sleep(10);
echo 'over' . time();
//新增结束
if(is_array($data) && $data) {
//保证仅允许第一个获锁的进入
if ($r->incr($r_key_lock) === 1) {
for ($i = 0; $i < 10; $i++) {
$r->rPush($r_key, json_encode($i));
}
$r->Expire($r_key, 3000);
//给锁key增加有效期,有效期为判断key是否存在,到为key复制的最大时间,保证有效期内所有请求只有一个能拿到锁
$r->Expire($r_key_lock, 11);
} else {
echo '002';
}
} else {
// DB异常或无数据,生成防穿透临时缓存并返回
$r->lPush($r_key, '-1');
$r->Expire($r_key, 60);
echo '000';
}
} elseif ($r->LLEN($r_key) !== false && $r->LRANGE($r_key, 0, 0)[0] == -1) {
echo '0-00';
}
echo 'ok';
}