insert(self::redisListToArray($userVisitMenuLogsL1)); self::switchL1ToL2(); } catch (\Exception $e) { return; } } /** * @param Request $request */ public static function set(Request $request): void { $uri = substr($request->getRequestUri(), 1); // 请求方法为get if ($request->method() == 'GET') { $menu = Menu::query()->where('route', $uri)->first(); if ($menu) { //redis正常保存在缓存中 $date = date('Y-m-d H:i:s'); $userVisitMenuLog = new UserVisitMenuLog([ 'user_id' => Auth::user()['id'], 'menu_id' => $menu->id, 'created_at' => $date, 'updated_at' => $date, ]); try { //菜单点击入缓存 Redis::LPUSH('UserVisitMenuLogsL1', $userVisitMenuLog); } catch (\Exception $e) { //连接不上缓存。直接入库 $userVisitMenuLog->save(); } } } } public static function activeMenus() { if (Redis::LLEN('UserVisitMenuLogsL1') + Redis::LLEN('UserVisitMenuLogsL2') > 0) { //缓存中有数据 $array1 = self::redisListToArray(Redis::LRANGE('UserVisitMenuLogsL1', 0, -1)); $array2 = self::redisListToArray(Redis::LRANGE('UserVisitMenuLogsL2', 0, -1)); $array = array_merge($array1, $array2); $conller = collect($array); $user_id = 1; if (Auth::user()) { $user_id = Auth::user()->id; } $arr = $conller->filter(function ($item) use ($user_id){ return $user_id === $item['user_id']; })->groupBy('menu_id')->sortByDesc(function ($item){ return $item->count(); })->forPage(0,5)->keys(); $menus = Menu::query()->find($arr)->sortBy(function($item)use($arr){ return $arr->search($item->id); }); dd($menus,$arr); } } /** * 将缓存中的数据拿出保存,转换为数组,方便数据库保存 * @param $userVisitMenuLogsStr * @return array */ public static function redisListToArray($userVisitMenuLogsStr): array { $userVisitMenuLogsArr = []; foreach ($userVisitMenuLogsStr as $userVisitMenuLog) { $userVisitMenuLogObj = json_decode($userVisitMenuLog); $userVisitMenuLogsArr[] = [ 'user_id' => $userVisitMenuLogObj->user_id, 'menu_id' => $userVisitMenuLogObj->menu_id, 'created_at' => $userVisitMenuLogObj->created_at, 'updated_at' => $userVisitMenuLogObj->updated_at, ]; } return $userVisitMenuLogsArr; } /** *将L1缓存转移到L2 */ public static function switchL1ToL2(): void { while (Redis::LLEN('UserVisitMenuLogsL1') > 0) { Redis::LPUSH('UserVisitMenuLogsL2', Redis::LPOP('UserVisitMenuLogsL1')); } } }