微擎利用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, '请勿重复退款!'); } } }