もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

laravelのcachedriverをmemcachedにしている状態で ttlを指定してもなぜか時間が来てもデータが消えない 2

はじめに

こんばんは。

以前ブログで書いた 記事でまた似たような現象が起きました。

kojirooooocks.hatenablog.com

今度は違う理由だったので備忘録のため残しておきます。

本題

今回も同じくttlで指定した時間にキャッシュが消えてない現象が発生しました。

$key = 'xxxx_key';
$value = 'aaaaaa';
$ttl = CarbonImmutable::now()->addHour(); // 1時間後に設定
Cache::put($key, $value, $ttl);

前回のことがあってmemcachedのtimezoneの設定は Asia/Tokyo に指定したのでTZのズレもないはずなのにやはり消えてませんでした。

もろもろ調べてわかったことは、memcachedのコンテナ内の時間ではなく、memcached内のtime設定が何故かずれていました。

% telnet localhost 11211
stats
STAT pid 1
STAT uptime 32118
STAT time xxxxxxxxxxxx ←こいつ。今回でいうと5時間前にずれていた
STAT version 1.6.29
...
....
END

調査してわかったのは、m1 macのlocal docker開発環境で開発中の際、pc自体をsleepしていたらmemcached内のtime設定がずれるみたいでした。

実際にsleepした時間分timeがやはりずれていました。

memcachedは、有効期限を指定しても期限が来たら自動的に消えるわけではなく、期限切れの状態で取得しようとして初めて消えるようです。

なので期限切れの状態でもデータを取得ようとしなければデータは残ったままになります。

また、memcachedの有効期限は絶対指定と相対指定があり、相対指定の場合は30日以内(60 * 60 * 24 * 30)にすることが条件で、30日を超える場合は強制的に絶対指定となるみたいです。

前回の記事でも記載しましたが、laravelの Cache 経由で有効期限ありで保存しようとすると Carbonの toTimestamp() で指定するので、数値的に必ず絶対指定になります。

上記のような状態で、今日の10時に、1時間後の11時切れるように指定したら 絶対時間の 2024-09-15 11:00 にきれるように登録されます。

ただ memcachedの現在時間が5時間前になっているため 6時間後にきれるようになっていたようです。

なので、結論ローカルでの開発時に起きる不具合でした。

終わりに

かなりハマりましたがなんとか解決・理解できてよかったです。

もしなんか違っているとかありましたら、コメントもらえたらありがたいです。

現場からは以上です。