はじめに
こんばんは。
以前ブログで書いた 記事でまた似たような現象が起きました。
今度は違う理由だったので備忘録のため残しておきます。
本題
今回も同じく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時間後にきれるようになっていたようです。
なので、結論ローカルでの開発時に起きる不具合でした。
終わりに
かなりハマりましたがなんとか解決・理解できてよかったです。
もしなんか違っているとかありましたら、コメントもらえたらありがたいです。
現場からは以上です。