[CORE][Cache] Add getListPartialCache, which allows for fetching a list and backing only a portion of it in the cache (useful for feeds and replies to notes, for instance)
This commit is contained in:
parent
46c4bd9099
commit
85ce6bfd41
|
@ -317,6 +317,42 @@ abstract class Cache
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list partially from cache, partially from the DB
|
||||
*
|
||||
* Uses two fetches in the worst case, but the first is likely cached
|
||||
*
|
||||
* @param callable(int $limit, int $offset): (array<int,mixed>) $calculate
|
||||
*/
|
||||
public static function getListPartialCache(string $key, callable $calculate, int $max_cache_count, int $left, ?int $right = null, string $pool = 'default', float $beta = 1.0): array
|
||||
{
|
||||
if ($left < $max_cache_count) {
|
||||
$middle = $max_cache_count;
|
||||
$cached_portion = self::getList(
|
||||
$key,
|
||||
fn () => $calculate(limit: $max_cache_count, offset: 0),
|
||||
pool: $pool,
|
||||
max_count: $max_cache_count,
|
||||
left: $left,
|
||||
right: $right,
|
||||
beta: $beta,
|
||||
);
|
||||
} else {
|
||||
$middle = $left;
|
||||
$cached_portion = [];
|
||||
}
|
||||
|
||||
$right ??= \PHP_INT_MAX;
|
||||
$limit = $right - $middle;
|
||||
if ($right > $max_cache_count) {
|
||||
$non_cached_portion = $calculate(limit: $limit, offset: $middle);
|
||||
} else {
|
||||
$non_cached_portion = [];
|
||||
}
|
||||
|
||||
return [...$cached_portion, ...$non_cached_portion];
|
||||
}
|
||||
|
||||
/**
|
||||
* Push a value to the list
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue
Block a user