From 9c17def4a0cba4033b4c36d4639464835362dc42 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Thu, 9 Jun 2022 04:09:05 -0600 Subject: [PATCH] Update UserFilterService, improve cache strategy by using in-memory state via UserFilterObserver for empty lists with a ttl of 90 days. --- app/Services/UserFilterService.php | 39 ++++++++++++++++-------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/app/Services/UserFilterService.php b/app/Services/UserFilterService.php index 49118b579..01e2e4053 100644 --- a/app/Services/UserFilterService.php +++ b/app/Services/UserFilterService.php @@ -3,26 +3,24 @@ namespace App\Services; use Cache; +use App\UserFilter; use Illuminate\Support\Facades\Redis; -use App\{ - Follower, - Profile, - UserFilter -}; - -class UserFilterService { - +class UserFilterService +{ const USER_MUTES_KEY = 'pf:services:mutes:ids:'; const USER_BLOCKS_KEY = 'pf:services:blocks:ids:'; - public static function mutes(int $profile_id) : array + public static function mutes(int $profile_id) { $key = self::USER_MUTES_KEY . $profile_id; - $cached = Redis::zrevrange($key, 0, -1); - if($cached) { - return $cached; + $warm = Cache::has($key . ':cached'); + if($warm) { + return Redis::zrevrange($key, 0, -1) ?? []; } else { + if(Redis::zrevrange($key, 0, -1)) { + return Redis::zrevrange($key, 0, -1); + } $ids = UserFilter::whereFilterType('mute') ->whereUserId($profile_id) ->pluck('filterable_id') @@ -30,29 +28,34 @@ class UserFilterService { foreach ($ids as $muted_id) { Redis::zadd($key, (int) $muted_id, (int) $muted_id); } + Cache::set($key . ':cached', 1, 7776000); return $ids; } } - public static function blocks(int $profile_id) : array + public static function blocks(int $profile_id) { $key = self::USER_BLOCKS_KEY . $profile_id; - $cached = Redis::zrevrange($key, 0, -1); - if($cached) { - return $cached; + $warm = Cache::has($key . ':cached'); + if($warm) { + return Redis::zrevrange($key, 0, -1) ?? []; } else { + if(Redis::zrevrange($key, 0, -1)) { + return Redis::zrevrange($key, 0, -1); + } $ids = UserFilter::whereFilterType('block') ->whereUserId($profile_id) ->pluck('filterable_id') ->toArray(); foreach ($ids as $blocked_id) { - Redis::zadd($key, $blocked_id, $blocked_id); + Redis::zadd($key, (int) $blocked_id, (int) $blocked_id); } + Cache::set($key . ':cached', 1, 7776000); return $ids; } } - public static function filters(int $profile_id) : array + public static function filters(int $profile_id) { return array_unique(array_merge(self::mutes($profile_id), self::blocks($profile_id))); }