redis 并发导致list重复问题

//模拟并发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';
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值