removeCache($model->rule_name); }); self::afterDelete(function ($model) { $model->removeCache($model->rule_name); }); } /** * 是否是白名单 * @param $rule_name * @param $channel_id * @return int */ public function isWhite($rule_name, $channel_id) { $isWhite = 0; $redisKey = $this->redisKey.$rule_name; $redisData = Redis::instance()->hGetAll($redisKey); $fromDb = false; if (!empty($redisData)) { if (isset($redisData['expire_time']) && $redisData['expire_time'] <= time()) { $fromDb = true; } else { if (strrpos($redisData['channel_id'], '*') !== false) { //全部 $isWhite = 1; } else if (strlen($redisData['channel_id']) > 0) { $channelIdArr = explode(',', $redisData['channel_id']); if (in_array($channel_id, $channelIdArr)) { $isWhite = 1; } } } } else { $fromDb = true; } if ($fromDb) { //读库缓存所有的结果 $data = [ 'channel_id' => '' ]; $dbRow = $this->where('rule_name', 'eq', $rule_name)->find(); if ($dbRow) { $data = $dbRow->toArray(); $channelIdsRow =model("ChannelMenuList")->where('id', 'eq', $data['channel_id'])->find(); $data['channel_id'] = $channelIdsRow['channel_id'] ?: ''; if (strrpos($data['channel_id'], '*') !== false) { //全部 $isWhite = 1; } else if (strlen($data['channel_id']) > 0) { $channelIdArr = explode(',', $data['channel_id']); if (in_array($channel_id, $channelIdArr)) { $isWhite = 1; } } } $data['expire_time'] = time() + 600; //写入redis 哈希结构 Redis::instance()->hMSet($redisKey, $data); $expire = 3600 + mt_rand(0, 1000); Redis::instance()->expire($redisKey, $expire); } return $isWhite; } public function removeCache($rule_name) { $key = $this->redisKey.$rule_name; Redis::instance()->del($key); } }