国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

淺談Django的緩存機制

2020-01-04 14:40:15
字體:
來源:轉載
供稿:網友

由于Django是動態(tài)網站,所有每次請求均會去數據進行相應的操作,當程序訪問量大時,耗時必然會更加明顯,最簡單解決方式是使用:緩存,緩存將一個某個views的返回值保存至內存或者memcache中,5分鐘內再有人來訪問時,則不再去執(zhí)行view中的操作,而是直接從內存或者Redis中之前緩存的內容拿到,并返回。

Django中提供了6種緩存方式:

  1. 開發(fā)調試
  2. 內存
  3. 文件
  4. 數據庫
  5. Memcache緩存(python-memcached模塊)
  6. Memcache緩存(pylibmc模塊)

通用配置

'TIMEOUT': 300,            # 緩存超時時間(默認300,None表示永不過期,0表示立即過期)    'OPTIONS':{     'MAX_ENTRIES': 300,          # 最大緩存?zhèn)€數(默認300)     'CULL_FREQUENCY': 3,          # 緩存到達最大個數之后,剔除緩存?zhèn)€數的比例,即: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

開發(fā)調試

  # 此為開始調試用,實際內部不做任何操作  # 配置:    CACHES = {      'default': {        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',   # 引擎       通用配置      }    }

內存

  # 此緩存將內容保存至內存的變量中  # 配置:    CACHES = {      'default': {        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',        'LOCATION': 'unique-snowflake',       通用配置      }    }  # 注:其他配置同開發(fā)調試版本

文件

  # 此緩存將內容保存至文件  # 配置:    CACHES = {      'default': {        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',        'LOCATION': '/var/tmp/django_cache',         通用配置      }    }  # 注:其他配置同開發(fā)調試版本

數據庫

 # 此緩存將內容保存至數據庫  # 配置:    CACHES = {      'default': {        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',        'LOCATION': 'my_cache_table', # 數據庫表       通用配置      }    }  # 注:執(zhí)行創(chuàng)建表命令 python manage.py createcachetable

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',      ]    }  }

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',      ]    }  }

緩存的應用

單獨視圖緩存

from django.views.decorators.cache import cache_page@cache_page(60 * 15)def my_view(request):      ...

即通過裝飾器的方式實現(xiàn),導入模塊之后,在需要緩存的函數前加@cache_page(60 * 15) 60*15表示緩存時間是15分鐘

例子如下:

from django.views.decorators.cache import cache_page@cache_page(10)def cache(request):  import time  ctime = time.time()  return render(request,"cache.html",{"ctime":ctime})

前端頁面如下:

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>Title</title></head><body>  <h1>{{ ctime }}</h1>  <h1>{{ ctime }}</h1>  <h1>{{ ctime }}</h1></body></html>

這樣在前端頁面在獲取的ctime的時候就會被緩存10秒鐘,10秒鐘之后才會變化,但是這樣的話就相當月所有的調用ctime的地方都被緩存了

局部緩存

引入TemplateTag

{% load cache %}

使用緩存

{% cache 5000 緩存key %}

緩存內容

{% endcache %}

更改前端代碼如下:

{% load cache %}<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>Title</title></head><body>  <h1>{{ ctime }}</h1>  <h1>{{ ctime }}</h1>  {% cache 10 c1 %}  <h1>{{ ctime }}</h1>  {% endcache %}</body></html>

這樣就實現(xiàn)了最后一個ctime緩存,其他兩個不緩存

全站緩存

全站緩存的時候,需要在中間件的最上面添加:

'django.middleware.cache.UpdateCacheMiddleware',

在中間件的最下面添加:

'django.middleware.cache.FetchFromCacheMiddleware',

其中'django.middleware.cache.UpdateCacheMiddleware'里面只有process_response方法,在'django.middleware.cache.FetchFromCacheMiddleware'中只有process_request方法,所以最開始是直接跳過UpdateCacheMiddleware,然后從第一個到最后一個中間件的resquest,第一次沒有緩存座椅匹配urls路由關系依次進過中間件的process_view,到達views函數,再經過process_exception最后經過response,到達FetchFromCacheMiddleware

另一個讓我煩惱一個多小時的問題是,設置 TIMEOUT 參數無效。查找Django的源文件( ./core/cache/backends/memcached.py ),打印出設置緩存時的信息。發(fā)現(xiàn)不論參數設置多少,緩存的有效期都變成了600s。

后來終于在django的 conf/global_settings.py 這個文件里找到 CACHE_MIDDLEWARE_SECONDS = 600 這個參數??疵质侵虚g件的緩存時間,懶得深究了。在 settings.py 文件中把這個參數值也修改一下,再次測試,終于得到預期的效果。這個問題竟然在放狗都沒搜到,值得一記。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 策勒县| 大同市| 任丘市| 同德县| 米脂县| 乌兰浩特市| 天全县| 固阳县| 东辽县| 锡林浩特市| 沙湾县| 彭水| 宁国市| 石嘴山市| 瑞丽市| 浦县| 铜梁县| 辽阳县| 竹北市| 云霄县| 马边| 兴隆县| 湖州市| 阳东县| 萨迦县| 巴林右旗| 平远县| 荣昌县| 红安县| 师宗县| 且末县| 雷山县| 江门市| 象州县| 临沭县| 葵青区| 凤冈县| 桃源县| 大悟县| 钦州市| 当涂县|