[Django] per-site Cache を有効にしてサイト表示を高速化する
2017/09/27 06:00
  • Django のトピックスです。
    Django にはもともと Django's cache framework というキャッシュ機構(フレームワーク)が入っているのですが、
    今回はその中で per-page cache という、ページ単位でキャッシュしてくれる機能を有効にしました。

    キャッシュを有効にする

    キャッシュを有効にするために、 settings.py に追記します。

    MIDDLEWARE_CLASSES = (
        # 一番最後に以下の3行を追記する
        'django.middleware.cache.UpdateCacheMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.cache.FetchFromCacheMiddleware',
    )
    
    # さらに、 CACHES も追記
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
            'LOCATION': 'sample_cache',
        }
    }
    

    キャッシュ機構に memcached なども使えますが、今回は一番お手軽にできるデータベースキャッシュ
    利用することにしました。

    キャッシュ保存用テーブルの作成

    次に、キャッシュ保存用のテーブルを作成します。
    テーブル名は先程 settings.py の CASHES.default.LOCATION で指定した名前になります。
    キャッシュ用テーブルの作成にもコマンドが用意されています。

    キャッシュ用テーブルを作成する

    $ ./manage.py createcachetable
    

    完了すると、 sample_cache テーブルが作成されています。
    基本的にはこれだけでキャッシュが有効になります。(再起動は必要)

    mysql> desc sample_cache;
    +-----------+--------------+------+-----+---------+-------+
    | Field     | Type         | Null | Key | Default | Extra |
    +-----------+--------------+------+-----+---------+-------+
    | cache_key | varchar(255) | NO   | PRI | NULL    |       |
    | value     | longtext     | NO   |     | NULL    |       |
    | expires   | datetime(6)  | NO   | MUL | NULL    |       |
    +-----------+--------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)
    

    ページにアクセスしてみる

    適当にトップページなどアクセスしてみます。
    mysql> select cache_key, expires from sample_cache limit 10;
    +----------------------------------------------------------------------------------------------------------------+----------------------------+
    | cache_key                                                                                                      | expires                    |
    +----------------------------------------------------------------------------------------------------------------+----------------------------+
    | :1:views.decorators.cache.cache_header..f63760d14d86adb7b746749a4e9f057c.ja                                    | 2017-09-26 20:01:01.000000 |
    | :1:views.decorators.cache.cache_page..GET.f63760d14d86adb7b746749a4e9f057c.d41d8cd98f00b204e9800998ecf8427e.ja | 2017-09-26 20:01:01.000000 |
    | :1:views.decorators.cache.cache_header..c49aaf494ecc43da15574567b723d583.ja                                    | 2017-09-26 20:01:07.000000 |
    | :1:views.decorators.cache.cache_page..GET.c49aaf494ecc43da15574567b723d583.d41d8cd98f00b204e9800998ecf8427e.ja | 2017-09-26 20:01:07.000000 |
    | :1:views.decorators.cache.cache_header..847a256705f28e69e0d3228b222b9245.ja                                    | 2017-09-26 20:01:11.000000 |
    | :1:views.decorators.cache.cache_page..GET.847a256705f28e69e0d3228b222b9245.d41d8cd98f00b204e9800998ecf8427e.ja | 2017-09-26 20:01:11.000000 |
    | :1:views.decorators.cache.cache_header..90db813adf0cd65f3b7769485a2b5196.ja                                    | 2017-09-26 20:01:13.000000 |
    | :1:views.decorators.cache.cache_page..GET.90db813adf0cd65f3b7769485a2b5196.d41d8cd98f00b204e9800998ecf8427e.ja | 2017-09-26 20:01:13.000000 |
    | :1:views.decorators.cache.cache_header..617fd9349103ea8a5f68286566e0d4d6.ja                                    | 2017-09-26 20:01:15.000000 |
    | :1:views.decorators.cache.cache_page..GET.617fd9349103ea8a5f68286566e0d4d6.d41d8cd98f00b204e9800998ecf8427e.ja | 2017-09-26 20:01:15.000000 |
    +----------------------------------------------------------------------------------------------------------------+----------------------------+
    10 rows in set (0.00 sec)
    

    キャッシュの有効期限はデフォルトでは 10 分になっているようです。

    実際のアクセス速度

    実際にどれくらい表示速度に変化があったのか見てみます。

    全然人気がなくて容量がやたら重いアルバムページを適当にピックアップw
    Chrome の Developer Tools で計測してみました。

    BEFORE
    キャッシュなし

    AFTER
    キャッシュあり


    ブラウザキャッシュが効いてるだけ説もありますが、一定の効果はありそうです。(;´Д`)ε-(´∀`*)ホッ


    ざっと動かすだけではこれで良いですが、一応以下も併せて設定しておくのが吉だと思います。

    settings.py

    
    CACHE_MIDDLEWARE_ALIAS = 'default'
    CACHE_MIDDLEWARE_SECONDS = 60 * 10 # 10 分(デフォルト)
    
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
            'LOCATION': 'sample_cache',
            'TIMEOUT': 60 * 10 # 10 分 ,
            'OPTIONS': {
                        'MAX_ENTRIES': 10000, 
                        'CULL_FREQUENCY': 2,
                   },
        }
    }
    

    参考:
    Django/Mezzanine Database Cache の設定をしてみる
    キャッシュを使う


    今後の展望

    キャッシュを導入することができたので、あとは任意のタイミングでキャッシュをクリアしたり、
    必要に応じて Template fragment caching など他の機構も試してみたいなぁと思いました。


    参考:
    Djangoのキャッシュをクリアする


    人気ブログランキングへ ブログランキング・にほんブログ村へ
    ↑応援よろしくお願いします!m(_ _)m

  • <2017/09/27 06:00>
  • Python
  • Djangocacheper-site cacheframeworkキャッシュサイトキャッシュ
  • 新しい記事へ
    [Windows] Ophcrack を使ってユーザーパスワードを解析する方法

    古い記事へ
    [WP] WP-CLI を使って WordPress の環境を爆速で構築する

profile picture

自己紹介的な何か

@wkmettyでついったーやってます。時々。 6年間勤めたゲーム会社を2018年2月に退職しフリーランスのプログラマに。 WordPress Core, WP-CLI コントリビューター。 お仕事募集中です。