php使用redis来实现限流和并发控制

      在一些瞬时可能会有大量并发请求同时到达服务器的场景下,比如抢购、限时活动等等,如果不对并发量进行控制,瞬时的高并发可能会导致系统崩溃,这时我们就需要把一部分请求挡掉,可以结合redis来实现一个基本的限流功能。

function makeOrder(\Redis $redis, $concurrencyKey) {
	try {
		if ($redis->incr($concurrencyKey) > 500) {
			if ($redis->ttl($concurrencyKey) == -1) {
				// 请求数超过限制,如果key没有过期时间则加上过期时间
				$redis->expire($concurrencyKey, 60);
				return false;
			}
		} else {
			// 请求数降下来,则清除key的过期时间
			$redis->persist($concurrencyKey);
		}
		
		// 处理业务逻辑...
		
		return true;
		
	} finally {
		$redis->decr($concurrencyKey);
	}
}

这里除了使用redis incr/decr原子计数外,还对计数key增加了过期时间的逻辑,防止incr操作成功,而decr操作失败,导致计数key的基数值越来越大而再无法降下去,最终将没有请求再能够进来,当然加过期时间也存在问题,当并发请求量一直在阈值之上,这时计数key会过期删除,但此时仍积压大量的请求,后来的请求又从新计数,可以把key的过期时间适当延长来降低影响。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值