キャッシュシステム v0.3.0~
babyrite は並行キャッシュライブラリ moka を使用し,Discord API で取得できたチャンネル情報をキャッシュし,再取得の手間を短縮しています.
キャッシュシステムの技術的制約について
- 明示的なキャッシュ無効化 (invalidate) の仕組みはありません.
- チャンネル名変更や削除、権限変更があっても TTI/TTL が切れるまで古い情報が返る可能性があります.
- キャッシュのキーはプロセス全体で共有します.
- 呼び出し元の
guild_id/channel_idが一致すれば別のギルドの Discord リンク展開でも再利用されます.
- 呼び出し元の
対応している機能
GitHub Permalink は対応していません.毎回 raw.githubusercontent.com に直接取得しています.
キャッシュ構成
babyrite はマシン上のメモリに以下のキャッシュ構成を組みます.
| キャッシュ | キー→値 | 用途 |
|---|---|---|
GUILD_CHANNEL_LIST_CACHE | GuildId → HashMap<ChannelId, GuildChannel> | ギルド単位のチャンネル一覧 |
GUILD_CHANNEL_CACHE | ChannelId → GuildChannel | 個別チャンネル |
両方とも以下のような共通設定で動作します:
- 最大 500 エントリ
- Least Recently Used (LRU) に基づいてキャッシュを整理します.
- サイズ超過分は最近最も使われなかったデータから削除します.
- TTI (Time To Idle):
- 1 時間アクセスがないデータを自動的に削除します.
- TTL (Time To Live):
- アクセス頻度に関わらずデータは 12 時間で失効します.
キャッシュのルックアップ手順について
メッセージ引用
GUILD_CHANNEL_CACHE(チャンネルキャッシュの集合体) からキャッシュを検索します- ヒットすればそのまま返します.
- 取得できなかった場合は
GUILD_CHANNEL_LIST_CACHE(チャンネルリストキャッシュの集合体) を引く- ヒットすればそのマップから対象チャンネルを探します.
- ヒットしなかった場合は Discord API から取得するようにし,結果をキャッシュに格納します.
- チャンネル一覧に対象のチャンネルが見つからない場合,アクティブスレッドを検索します.(スレッドはチャンネルリストには含まれないため)
- 見つかったチャンネルは最終的にキャッシュにも書き込まれます.