浏览代码

Update UserFilterService, improve cache strategy by using in-memory state via UserFilterObserver for empty lists with a ttl of 90 days.

Daniel Supernault 3 年之前
父节点
当前提交
9c17def4a0
共有 1 个文件被更改,包括 21 次插入18 次删除
  1. 21 18
      app/Services/UserFilterService.php

+ 21 - 18
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)));
 	}