始まり
5/4と5/5をまとめて書きます。
この二日でやったことは、以下の通りです。
- リバースプロキシのパーツについて
- 実際にLRUキャッシュの実装
1. リバースプロキシのパーツについて
簡単なリバースプロキシなら30分で作れたので、実際にエッジサーバとしてリバースプロキシを動かすときに必要なパーツであるキャッシュに関して考えようと思います。
キャッシュで重要なのはEviction Policyらしいです。それぐらいしかキャッシュを構成する要素がないとも言える。今回は有名なLRUキャッシュ(Least Recent Used)を採用してみようと思います。理由はシンプルだからです。
LRUキャッシュ
LRUキャッシュは知っていたので、とりあえずWikipediaをみた。
それと、Zennの解説も読んだ。LFU(Least Frequent Used)との比較も載っていてわかりやすかった。実際に、この二日はこれを実装した。
2. LRUCacheを実装してみる。
ただ、このコードには重大な問題があることが後でわかりました。というのも、list.Listを使ってKeyとValueを管理するだけでいいじゃんと思って実装したのですが、これだと**検索にO(N)かかってしまいます。**忘れてた!!!!!!結局キャッシュが増えていった結果、検索が遅くなるようでは使い物になりません。最初他の人のコードを見た時にmapとlist.Listが両方使われていたのはそういうことだったんですね。。。
追加と追い出しはO(1)で行えるのですが、一番重要な検索がO(N)かかっているので、いったん同じインターフェイスで実装を作り直そうと思います。ついでにベンチマークテストでもしようかな。
終わり
今回から、セキュリティキャンプに向けてやりたいことリストを作成するようにします。終わったら横線を入れておこうと思います。
やりたいことリスト
- リバースプロキシとは何かを理解する
- LRUキャッシュ
- Consistent Hashing
二日でLRUCacheの効率悪い版を実装しました(泣)
やりたいことリストに書いた通り、LRUCacheの改良が完了したら次はConsistent Hashingの実装をしてみようと思います。
待ってろよセキュリティキャンプ!
(5/4, 5/5 終わり)