Djangoのキャッシュ機能に関する記事をQiitaに投稿しました

はじめに

ここ最近はDjangoで作ったWebサービス「世界遺産トラベラーズ」のレスポンス向上に取り組んできました。

なぜ、レスポンス向上なのか。

それは、世界遺産トラベラーズを作り始める際に参考にさせていただいた「ホット チリ レビューズ」の作者ジャバ・ザ・ハットリさんのQiita投稿がずっと気になっていたからです。

無料だからと言ってレスポンスが遅いサイトになったら意味が無い。レスポンスにもとことんこだわっている。

(略)

  • HerokuのRedis(無料プラン)には25Mのキャッシュが置けるのでできるかぎりここにデータを置く
  • 全てのレスポンスはRedisキャッシュからとしてHerokuログ上では5ms以内とする
  • データベースが更新された際には、自動でその内容をRedisに書き込む処理を入れる
  • ユーザーからのリクエストを受けた際にそのレスポンスは常にキャッシュから返して、データベースはほぼ動かさない

Herokuの無料プランは30分間アクセスが無いとスリープ状態に入ってしまい、そうなると次のアクセス時はレスポンスが返ってくるまで10秒以上は待たせられます。

そんなHeroku無料プランで高速なレスポンスを実現しているのは私にとって異次元の技術なのですが、少しでもこれに近づくためにレスポンス向上に関して調べ、サービスに取り込んで行きました。

レスポンス向上の為の取り組み内容とQiita投稿内容

まず最初は、各画面でデータベースにアクセスする為のSQL文が無駄に発行されている傾向があったので、これをできる限り減らし、その上でキャッシュ機能を導入しました。

このキャッシュ機能の導入方法や、導入したことでレスポンスがどのように変化したかをQiitaには投稿しています。

1記事目

まず、最初はキャッシュの保存先をデータベース(RDBMS)としました。

これに関しては、

  • 追加のパッケージ等のインストールが不要
  • ローカルの開発環境とHerokuそれぞれのsettings.py等の設定方法が同じ

であるため、導入はお手軽なのですが、キャッシュを保存・更新する際はそのデータベースアクセスによってレスポンスが逆に悪化します。

Djangoでとりあえずビューやテンプレートをキャッシュする方法を試してみるには良いのですが、本番で提供するサービスに実際に導入するのは厳しいかなと感じています。

qiita.com

2・3記事目

続いて、キャッシュの保存先をMemcachedにしました。 Memcachedはデータベース(RDBMS)よりも読み書きが高速です。

こちらに関しては、

  • ローカルの開発環境、HerokuそれぞれへMemcachedのインストールが必要
  • Herokuで使う場合は追加のパッケージが必要
  • ローカルの開発環境とHerokuそれぞれでsettings.pyの設定内容が異なる

といったように導入時の若干の手間はあるものの、レスポンスが逆に悪化するようなデメリットは見受けられず、おすすめです。

以下2記事目ではローカルの開発環境への導入方法を、

qiita.com

以下3記事目ではHerokuへの導入方法を解説しています。

qiita.com

レスポンス向上に取り組んだ結果は?

以下のGoogleのサービスでは、URLを入れるだけでそのWebサイトをモバイル向けサイトとしてレスポンスに問題が無いか診断してくれます。

testmysite.withgoogle.com

こちらで世界遺産トラベラーズ(https://www.sekaiisan.site)を診断したところ、「特に良好」という結果になりました。

この結果を出せた時はちょっと感動しました(笑)

f:id:shonansurvivors:20181222194247p:plain