2022の2日目の記事です。こんにちは、証券フロンティア事業部の西永です。今回はLaravel内で行われているRedisの仕組みを覗いた際、気づいたことを備忘録として残したいと思います。氏が、イタリアのスタートアップのスケーラビリティを改善したいと考えていたときに始まりました。aws.amazon.com主にキャッシュとして使うkey-valueデータストア(KVS)ですね。Redisで使えますが、今回はAWS本体ではなくRedisに着目します。キャッシュの仕組みについてここのブログが非常に参考になります。大体ここを見れば分かると思います。$callback);中身の処理(かなり簡略化)ちなみにこの6373257fa23fc828194949の値はどうやって生成しているかについてですが、こちらもLaravelの方で独自に生成しています。true)で4b340550242239.64159797のような文字列を生成した後、str_replace()で4b34055024223964159797に置換して使用しています。値が被ったら意味がないのでその対策ですね。standard_refについてあともう一つ、Laravel経由でRedisを使う(セットする)際、タグ*1と実数値*2以外にもstandard_refなるものが設定されます。standard_ref「キャッシュの仕組みについて」で取り上げた仕組みだけだとこのstandard_refは不要そうに思えますが、こちらは一体何に使えるのでしょうか。Laravelのソースを確認すると下記で使われており、辿っていくとput()/set()/remember()する際に同時にstandard_refがセットされるような構造になっています。github.comつまり、Laravel経由で値を設定する際は大体standard_refが設定されることになります。次にこのstandard_refの中身はどうやって見るのかについてですが、こちらはRedisのSet型を利用しているため、その関連のコマンド等は大体使用できます。上記画像を見れば分かる通り、standard_refにはそのタグに関連した実数値のキー情報が入っています。standard_refを用いれば、タグに紐づいている実数値のキーを逆引きで持ってくることができます。この逆引きを利用して、Laravel内部ではCache::store('cache')->tags()->flush()を行う際、タグに紐づいている実数値のキーを一緒に消すようにしています。github.com削除する際、keysを使って検索して削除だと計算量が多くなりがち*3なので、計算量の肥大化を防ぐ工夫が行われているのは興味深いですね。このstandard_refですが、自由に保持期間が設定できる実数値のキーとは違い保持期間が無期限のため、キーの削除生成を繰り返しているとどんどん不要なstandard_refが増えてメモリを圧迫していきます。キャッシュデータベースを定期的にフラッシュできない場合は、タグを使用しないか、カスタムスクリプトを書いて残飯をクリーンアップしてください。github.comとのこと。カスタムスクリプトについてはそのissue内に有志の方が作られたスクリプトが載せられているので、それを用いることでメモリ圧迫問題を回避できる(かも)。8でタグの削除については改善されており、standard_refに加えてタグ*4も無期限保持ですが、Cache::store($cacheType)->tags($tags)->flush()を使用した際にちゃんとタグは物理削除するよう修正されています。github.comRedisでメモリが圧迫気味の方は確認してみてはいかがでしょうか。おわりに今取り組んでいる案件でもLaravelでRedisを使用した構築を用いており、その一環として調査した内容を取り上げました。同様の方がいらっしゃいましたら参考になりますと幸いです。その関連会社の商標です。使って他の人が実装したソースを解説してもらった。パブリックベータと...2021-12-17dockerはufwに穴を空ける。