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