Solid Cache
https://dev.37signals.com/solid-cache/
RDBMSをストアとする37signals製のキャッシュライブラリ
抱えていた課題
キャッシュストアとしてはRedisやmemcachedを利用するのが一般的だが、メモリキャッシュのため高価
メモリアクセスはディスクよりも何倍も高速だが、ネットワーク時間、serialize、圧縮も含める操作時間の中ではごくわずか
データベースにもメモリキャッシュは存在する
InnoDBのバッファプールなど
Basecampでは
Redisキャッシュと比較して書き込み・読み取りがRedisよりも25-50%遅くなったが、1.2ミリ秒が0.8-1.0ミリ秒になる程度なのでリクエストに占める割合はわずか
キャッシュは6倍大きく80%安いストレージで実行されるようになった
Solid Cache追加して以来、95パーセンタイルのリクエスト時間は375ミリ秒から225ミリ秒に短縮
fragment cacheを大量に使用していたため
ohbarye.icon キャッシュを少ししか使わないシステムでは恩恵はより少ないはず
キャッシュアルゴリズムはFIFO
LRUよりも非効率だがキャッシュの生存期間が長いのでデメリットは軽減される
管理が簡単でもある
アイテムがいつ読み取られたか記録しなくてよい
最大 ID と最小 ID を比較することでキャッシュ サイズの推定、制御ができる
テーブルの一方の端から削除し、もう一方の端に追加することで、(少なくとも MySQL では) 断片化を回避できる
コード
インストール時に作成されるmigration
シンプルなkey, valueをバイナリで保存する
code:db/migrate/20230724121448_create_solid_cache_entries.rb
class CreateSolidCacheEntries < ActiveRecord::Migration7.0
def change
create_table :solid_cache_entries do |t|
t.binary :key, null: false, limit: 1024
t.binary :value, null: false, limit: 512.megabytes
t.datetime :created_at, null: false
t.index :key, unique: true
end
end
end
https://github.com/rails/solid_cache/blob/9631687744cc8deb32e212e2b96f9125d43edb1a/db/migrate/20230724121448_create_solid_cache_entries.rb