New mysql cache cleanup

This commit is contained in:
Alexander Pankratov 2020-06-09 01:47:54 +03:00
parent 2aab5e8cc8
commit ca03bc662a
2 changed files with 15 additions and 15 deletions

View File

@ -2,6 +2,9 @@
namespace danog\MadelineProto\Db;
use Amp\Loop;
use danog\MadelineProto\Logger;
trait ArrayCacheTrait
{
/**
@ -18,7 +21,6 @@ trait ArrayCacheTrait
protected array $cache = [];
protected string $ttl = '+5 minutes';
private string $ttlCheckInterval = '+1 minute';
private int $nextTtlCheckTs = 0;
protected function getCache(string $key, $default = null)
{
@ -30,8 +32,6 @@ trait ArrayCacheTrait
$this->cache[$key]['ttl'] = strtotime($this->ttl);
}
$this->cleanupCache();
return $result;
}
@ -47,8 +47,6 @@ trait ArrayCacheTrait
'value' => $value,
'ttl' => strtotime($this->ttl),
];
$this->cleanupCache();
}
/**
@ -61,12 +59,9 @@ trait ArrayCacheTrait
unset($this->cache[$key]);
}
/**
* Remove all keys from cache
*/
protected function clearCache(): void
protected function startCacheCleanupLoop(): void
{
$this->cache = [];
Loop::repeat(strtotime($this->ttlCheckInterval, 0) * 1000, fn() => $this->cleanupCache());
}
/**
@ -75,11 +70,6 @@ trait ArrayCacheTrait
protected function cleanupCache(): void
{
$now = time();
if ($this->nextTtlCheckTs > $now) {
return;
}
$this->nextTtlCheckTs = strtotime($this->ttlCheckInterval, $now);
$oldKeys = [];
foreach ($this->cache as $cacheKey => $cacheValue) {
if ($cacheValue['ttl'] < $now) {
@ -89,6 +79,14 @@ trait ArrayCacheTrait
foreach ($oldKeys as $oldKey) {
$this->unsetCache($oldKey);
}
Logger::log(
sprintf(
"cache for table:%s; keys left: %s; keys removed: %s",
$this->table, \count($this->cache), \count($oldKeys)
),
Logger::VERBOSE
);
}
}

View File

@ -57,6 +57,8 @@ class MysqlArray implements DbArray
$instance->db = static::getDbConnection($settings);
$instance->ttl = $settings['cache_ttl'] ?? $instance->ttl;
$instance->startCacheCleanupLoop();
return call(static function() use($instance, $value) {
yield from static::renameTmpTable($instance, $value);
yield from $instance->prepareTable();