1. 程式人生 > >Django緩存問題

Django緩存問題

soc urn options 開發 命令 ali mem tab page

由於Django是動態網站,所有每次請求均會去數據進行相應的操作,當程序訪問量大時,耗時必然會更加明顯,最簡單解決方式是使用:緩存,緩存將一個某個views的返回值保存至內存或者
memcache中,5分鐘內再有人來訪問時,則不再去執行view中的操作,而是直接從內存或者Redis中之前緩存的內容拿到,並返回。 Django中提供了6種緩存方式:   開發調試   內存   文件   數據庫   Memcache緩存(python
-memcached模塊)   Memcache緩存(pylibmc模塊)

1、開發調試

# 此為開始調試用,實際內部不做任何操作
    #
配置: CACHES = { default: { BACKEND: django.core.cache.backends.dummy.DummyCache, # 引擎 TIMEOUT: 300, # 緩存超時時間(默認300,None表示永不過期,0表示立即過期) OPTIONS:{ MAX_ENTRIES
: 300, # 最大緩存個數(默認300) CULL_FREQUENCY: 3, # 緩存到達最大個數之後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3) }, KEY_PREFIX: ‘‘, # 緩存key的前綴(默認空)
VERSION: 1, # 緩存key的版本(默認1) KEY_FUNCTION 函數名 # 生成key的函數(默認函數會生成為:【前綴:版本:key】) } } # 自定義key def default_key_func(key, key_prefix, version): """ Default function to generate keys. Constructs the key used by all other methods. By default it prepends the `key_prefix‘. KEY_FUNCTION can be used to specify an alternate function with custom key making behavior. """ return %s:%s:%s % (key_prefix, version, key) def get_key_func(key_func): """ Function to decide which key function to use. Defaults to ``default_key_func``. """ if key_func is not None: if callable(key_func): return key_func else: return import_string(key_func) return default_key_func

2、內存

# 此緩存將內容保存至內存的變量中
    # 配置:
        CACHES = {
            default: {
                BACKEND: django.core.cache.backends.locmem.LocMemCache,
                LOCATION: unique-snowflake,
            }
        }

    # 註:其他配置同開發調試版本

3、文件

# 此緩存將內容保存至文件
    # 配置:

        CACHES = {
            default: {
                BACKEND: django.core.cache.backends.filebased.FileBasedCache,
                LOCATION: /var/tmp/django_cache,
            }
        }
    # 註:其他配置同開發調試版本

4、數據庫

# 此緩存將內容保存至數據庫

    # 配置:
        CACHES = {
            default: {
                BACKEND: django.core.cache.backends.db.DatabaseCache,
                LOCATION: my_cache_table, # 數據庫表
            }
        }

    # 註:執行創建表命令 python manage.py createcachetable

5、Memcache緩存(python-memcached模塊)

# 此緩存使用python-memcached模塊連接memcache

    CACHES = {
        default: {
            BACKEND: django.core.cache.backends.memcached.MemcachedCache,
            LOCATION: 127.0.0.1:11211,
        }
    }

    CACHES = {
        default: {
            BACKEND: django.core.cache.backends.memcached.MemcachedCache,
            LOCATION: unix:/tmp/memcached.sock,
        }
    }   

    CACHES = {
        default: {
            BACKEND: django.core.cache.backends.memcached.MemcachedCache,
            LOCATION: [
                172.19.26.240:11211,
                172.19.26.242:11211,
            ]
        }
    }

6、Memcache緩存(pylibmc模塊)

# 此緩存使用pylibmc模塊連接memcache
    
    CACHES = {
        default: {
            BACKEND: django.core.cache.backends.memcached.PyLibMCCache,
            LOCATION: 127.0.0.1:11211,
        }
    }

    CACHES = {
        default: {
            BACKEND: django.core.cache.backends.memcached.PyLibMCCache,
            LOCATION: /tmp/memcached.sock,
        }
    }   

    CACHES = {
        default: {
            BACKEND: django.core.cache.backends.memcached.PyLibMCCache,
            LOCATION: [
                172.19.26.240:11211,
                172.19.26.242:11211,
            ]
        }
    }

應用:

全局使用

使用中間件,經過一系列的認證等操作,如果內容在緩存中存在,則使用FetchFromCacheMiddleware獲取內容並返回給用戶,當返回給用戶之前,判斷緩存中是否已經存在,
如果不存在則UpdateCacheMiddleware會將緩存保存至緩存,從而實現全站緩存 MIDDLEWARE
= [ django.middleware.cache.UpdateCacheMiddleware, # 其他中間件... django.middleware.cache.FetchFromCacheMiddleware, ] CACHE_MIDDLEWARE_ALIAS = "" CACHE_MIDDLEWARE_SECONDS = "" CACHE_MIDDLEWARE_KEY_PREFIX = ""

單獨視圖的使用

方式一:
        from django.views.decorators.cache import cache_page

        @cache_page(60 * 15)
        def my_view(request):
            ...

方式二:
        from django.views.decorators.cache import cache_page

        urlpatterns = [
            url(r^foo/([0-9]{1,2})/$, cache_page(60 * 15)(my_view)),
        ]

局部使用

a. 引入TemplateTag

        {% load cache %}

 b. 使用緩存

        {% cache 5000 緩存key %}
            緩存內容
        {% endcache %}

Django緩存問題