微擎利用Redis防止定金重复退款

先看前文Redis防止业务重复处理的应用,本文要处理的是微擎模块在处理定金退款时,防止重复执行的部分。

直接看代码吧

/**
 * Redis 防止定金重复退款
 * 判断redis中key是否存在且在有效期内,符合则不允许重复提交;
 * 不存在则设置一个key,同时设置过期时间,再执行退款逻辑
 **/
$open_redis = function_exists('redis') && !is_error(redis());
if( $open_redis ){
	$redis_key = $uniacid . '_yjw_preselldeposit_refund_' . $orderid; //拼接 redis key
	$redis = redis();
	
	if( !is_error($redis) ){
		//利用setnx特性,设置一个特定的key和一个超时时间,成功则执行业务逻辑
		if( $redis->setnx($redis_key, time()) ){
			$redis->expireAt($redis_key, time() + 2); //设置key键的过期时间
		}
		else if ( $redis->get($redis_key) + 2 < time() ){
			$redis->del($redis_key); // 删除该key,若需要获取返回值,则返回值为 int(1)
		}
		else {
			return error(-1, '请勿重复退款!');
		}
	}
}