盒子汽车
Redis使用场景
生成不重复订单号(数据类型-字符串):
/**
* 返回周期内从1~n计数数值
* 如:$range=y表示本年内从1开始计数,$range=d表示本月内从1开始计数
* 如:$size=4表示周期内最大值为9999(超出最大值返回false),且均返回4位数值
*
* @param string $flag 应用唯一标识,避免应用间相互干扰
* @param integer $size 将返回的数值长度
* @param string $range 周期类型 y:年 m:月 d:日 如:y 表示本年
* @return integer|boolean
* @throws Exception
*/
public static function getCycleId($flag, $size=4, $range='y') {
switch(strtolower($range)) {
case 'm':
$timekey = date('Ym');
break;
case 'd':
$timekey = date('Ymd');
break;
default:
$timekey = date('Y');
}
$key = "GENUID_SERVICE_NUMBER_".$timekey.$flag;
$redis = new \S\Db\Redis();
$retry = 0;
$uid = null;
do{
try {
$uid = $redis->incr($key);
break;
}catch (\Exception $e){
$retry++;
}
} while ($retry < self::RETRY_TIMES);
if ($uid === null) {
return false;
}
if($uid > pow(10, $size)){
return false;
}
$uid = sprintf("%0{$size}d", $uid);
return $uid;
}
频率限制(数据类型-哈希):
/**
* 先判断后计数
*
* @param string $rule_name 规则名
* @param string $key 唯一标示
* @param int $threshold 阈值
* @param int $ttl 过期时效
* @param int $increment default 1 单次增加频率数量
*
* @return int|bool 成功返回已计数次数, 失败返回false
*/
public function add($rule_name, $key, $threshold, $ttl, $increment = 1) {
if (!$this->check($rule_name, $key, $threshold)) {
return false;
}
$result = self::$_redis->hIncrBy($rule_name, $key, $increment);
if (self::$_redis->ttl($rule_name) < 0) {
self::$_redis->expire($rule_name, $ttl);
}
return $result;
}
/**
* @param string $rule_name 规则名
* @param string $key 唯一标示
* @param int $threshold 阈值
*
* @return bool|string
*/
public function check($rule_name, $key, $threshold){
$count = self::$_redis->hGet($rule_name, $key);
$result = ($threshold > intval($count));
return $result;
}
订单锁(数据类型-字符串):当管理员审核订单时,为订单上锁,防止其他人重复审核,审核出结果后再将锁打开。
守护进程、消息队列(数据类型-List):将异步处理任务push进队列,后台进程pop出任务处理。
订单结清列表、逾期列表(数据类型-哈希):每天从外部系统定时取数据存到缓存中,做到每天可看到最新的数据。
微信银行
Redis使用场景
生成订单号
频率限制
存储用户基本信息:每个接口都回去取用户信息,先从缓存取,取不到再从数据库取,然后再存入缓存并为缓存设置生命周期。
新建项目
1、phplib中自动创建脚本cg.php,修改项目路径、日志路径、数据库密码等信息,运行。
2、修改该项目的nginx配置,使用nginx -t命令查看nginx配置是否有错误,重启nginx。
3、修改php.ini中yaf配置。