Skip to content

キャッシュシステム v0.3.0~

babyrite は並行キャッシュライブラリ moka を使用し,Discord API で取得できたチャンネル情報をキャッシュし,再取得の手間を短縮しています.

キャッシュシステムの技術的制約について

  • 明示的なキャッシュ無効化 (invalidate) の仕組みはありません.
    • チャンネル名変更や削除、権限変更があっても TTI/TTL が切れるまで古い情報が返る可能性があります.
  • キャッシュのキーはプロセス全体で共有します.
    • 呼び出し元の guild_id / channel_id が一致すれば別のギルドの Discord リンク展開でも再利用されます.

対応している機能

GitHub Permalink は対応していません.毎回 raw.githubusercontent.com に直接取得しています.

キャッシュ構成

babyrite はマシン上のメモリに以下のキャッシュ構成を組みます.

キャッシュキー→値用途
GUILD_CHANNEL_LIST_CACHEGuildIdHashMap<ChannelId, GuildChannel>ギルド単位のチャンネル一覧
GUILD_CHANNEL_CACHEChannelIdGuildChannel個別チャンネル

両方とも以下のような共通設定で動作します:

  • 最大 500 エントリ
    • Least Recently Used (LRU) に基づいてキャッシュを整理します.
    • サイズ超過分は最近最も使われなかったデータから削除します.
  • TTI (Time To Idle):
    • 1 時間アクセスがないデータを自動的に削除します.
  • TTL (Time To Live):
    • アクセス頻度に関わらずデータは 12 時間で失効します.

キャッシュのルックアップ手順について

メッセージ引用

  1. GUILD_CHANNEL_CACHE (チャンネルキャッシュの集合体) からキャッシュを検索します
    • ヒットすればそのまま返します.
  2. 取得できなかった場合は GUILD_CHANNEL_LIST_CACHE (チャンネルリストキャッシュの集合体) を引く
    • ヒットすればそのマップから対象チャンネルを探します.
    • ヒットしなかった場合は Discord API から取得するようにし,結果をキャッシュに格納します.
  3. チャンネル一覧に対象のチャンネルが見つからない場合,アクティブスレッドを検索します.(スレッドはチャンネルリストには含まれないため)
  4. 見つかったチャンネルは最終的にキャッシュにも書き込まれます.