90:KVS(Key Value Store)を利用しよう¶
Webアプリケーションを開発していて「大量のデータをRDBから何度も取得して処理が重くなった」「突然サーバーが高負荷になってしまった」 というような経験はありませんか?
具体的な失敗¶
たとえばECサイトなどを商品一覧ページなどで、「多数のユーザーがアクセスしにきて重くなるので 表示速度を改善したい」という要望がきたとします。 このとき、RDBから一度取得した商品データをプログラム上でキャッシュして、高速にレスポンスを返すようにしました。
from app.models import Item
CACHED_ITEMS = None
def items_view(request):
global CACHED_ITEMS
if CACHED_ITEMS:
# キャッシュがあるときは RDB(Item) からデータを取得しない
items = CACHED_ITEMS
else:
items = Item.objects.all()
# すべての商品データをグローバル変数(メモリ)にキャッシュする
CACHED_ITEMS = list(items)
return render(request, 'items/index.html', {
"items": items,
})
ところが、商品データをメモリにすべて載せてしまったために、逆にサーバーのメモリが枯渇してしまい、サイト全体が重くなってしまいました。
ベストプラクティス¶
プログラムのメモリ上にキャッシュ用のデータを載せずに、KVS (Key Value Store)を利用しましょう。
KVSは、MySQL、PostgreSQLのようなRDBとは違い、単純なキーとそれに紐づく値を管理するデータストアです。
(中略)詳細は書籍 自走プログラマー をご参照ください