データをどう保持するべきか?(データベースの扱い)
永続的にデータを保持する方法はいくつかあります。
LRU などの機能を持ったモジュールを使っても良いのですが、
やや大げさで、いまひとつしっくりこない気がします。
つまり、そこまで真面目に virtual memory のような実装を
しなくてもよいのでは?という気がします。
それに、もし切実に必要なら、なんらかの
DBMS
DBMS = DataBase Management System
を使うべきでしょう。
そういったわけで FML では、expire の仕方に応じて
2つのデータ保持クラスを用意しています。
それは
サイズを気にせず、時間を区切って expire するのか?
使用する領域のサイズをある程度気にするか?の 2 種類です。
現在では
Tie::JournaledFile クラス
を利用した
Tie::JournaledDir クラス
もあるので、
将来
Tie::JournaledDir もしくは File::CacheDir かのいづれかは
不必要になるかも知れません。
また、インターフェイスの違いから適宜使い分けるのかもしれません。
Tie::JournaledFile クラス
これは、一つのファイルに append していくタイプです。
この機能は
Tie::JournaledFile
クラスが提供します。
このクラスは、データを追加もするし参照もしたい場合に用いられますが、
追加のオペレーションしか行なえません。
つまり LFS (Log Structured File System) のような振舞いです。
参照する際は最後に追加したデータが取り出されます。
つまり、値は追加された値を last match で取り出しています。
逆に、必要な場合には、過去のログを追跡していくことができます。
このクラスは、サイズを度外視して一定期間の間記録しておきたい
データに対して使います。
例えば、登録時の confirmation のキャッシュや
message-id キャッシュです。
これらは expire を時間で制御したいからです。
このクラスは引数でファイル名を与えることになっているので、
ファイル名に日付付のファイルを選ぶと良いでしょう。
なお検索時の挙動の
first match と last match は切替えることができます。
どちらの戦略で探すのか、
クラスオブジェクトを生成する際に明示的に指定することが推奨されます。
デフォルトは first match です。
File::CacheDir
この
File::CacheDir
クラスは、主にサイズに上限を設けたいタイプのデータを蓄える場合に用
います。expire の時間については気にしません。
サイズで有無を言わさず切ってしまいます。
デバッグ等に用いるデータはこれで十分と考えています。
普段は使わないデバッグのために、サイズを食われるのも嫌ですから。
このクラスは、あるディレクトリ(例: db/)の有限の複数のファイル郡の中に
データを蓄えます。
例えば db/ に 1 〜 100 の名前のファイルがつくられ、
順番に使われてきます。
これらのファイルはぐるぐる回って使われ、上書きされます。
旧 RingBuffer, File::CacheDir に統合されました。