redis是存于内存和磁盘;毕竟存在于内存的东西,对一些必须要求准确的数据当然有所顾虑,但是它对于一些对准确性不是要求非常高的确实非常友好,如页面或者部分数据缓存优化等等。建议学习 Redis基础
使用场景介绍:线下积分第三方接口推送不稳定;结合定时任务处理。有时候有个很蛋疼的事就是第三方的接口调用明明是同一个接口但是有时候返回的数据确实不一样的,具体是第三方在内部调试还是咋地我们不得而知,毕竟第三方也是由程序员在开发的,说不定有时还是同步在开发的情况。别人我们管不了,但是我们可以做“预测”。
上代码:
//正常调用第三方接口:如果第三方不推送加入redis列表中
public function afterSave($insert, $changedAttributes)
{
$data = $insert ? json_encode($this->attributes) : json_encode($changedAttributes);
//推送增加积分(除了erp不推送类型为20)
$list = json_decode($data,true);
if ($list['integral'] > 0 && $insert && $list['type'] != 20) {
//脚本取消订单返还积分、赠送积分放置队列脚本处理
$is_card_user = User::find()->where(['id' => $list['user_id']])->select('is_card_user')->scalar();
if ($is_card_user == 1) {
if (in_array($list['type'], [6, 7, 8, 13])) {
\Yii::$app->redis->lpush(CacheKeyEnum::INTEGRAL_QUEUE, $list['id']);
}else{
$v = self::findOne(['id' => $list['id']]);
pushIntegrals($list['store_id'], $list['user_id'], $list['integral'], self::getIntegralType($list['type']), self::getIntegralDetail($v));
}
}
}
$member = new MemberListForm();
$member->sendWxUpdate($data);
}
定时任务:
//定时任务中处理!
public function actionIntegral()
{
date_default_timezone_set("PRC");
$key = CacheKeyEnum::INTEGRAL_QUEUE;
$redis = \Yii::$app->redis;
$len = $redis->llen($key);
for ($i=1; $i<=$len; $i++) {
$id = $redis->lpop($key);
$info = Register::findOne(['id' => $id]);
if (!$info) {
$redis->lpush($key, $id);
continue;
}
pushIntegrals($info->store_id, $info->user_id, $info->integral, Register::getIntegralType($info->type), Register::getIntegralDetail($info));
unset($info);
}
echo 'success'. "\n";
}