经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
Django中提供的6种缓存方式详解
来源:jb51  时间:2019/8/6 8:31:22  对本文有异议

前言

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。

Django中提供了6种缓存方式:

  • 开发调试
  • 内存
  • 文件
  • 数据库
  • Memcache缓存(python-memcached模块)
  • Memcache缓存(pylibmc模块)

1、配置

a、开发调试

  1. # 此为开始调试用,实际内部不做任何操作
  2. # 配置:
  3. CACHES = {
  4. 'default': {
  5. 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎
  6. 'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
  7. 'OPTIONS':{
  8. 'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
  9. 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  10. },
  11. 'KEY_PREFIX': '', # 缓存key的前缀(默认空)
  12. 'VERSION': 1, # 缓存key的版本(默认1)
  13. 'KEY_FUNCTION' 函数名 # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
  14. }
  15. }
  16. # 自定义key
  17. def default_key_func(key, key_prefix, version):
  18. """
  19. Default function to generate keys.
  20. Constructs the key used by all other methods. By default it prepends
  21. the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
  22. function with custom key making behavior.
  23. """
  24. return '%s:%s:%s' % (key_prefix, version, key)
  25.  
  26. def get_key_func(key_func):
  27. """
  28. Function to decide which key function to use.
  29. Defaults to ``default_key_func``.
  30. """
  31. if key_func is not None:
  32. if callable(key_func):
  33. return key_func
  34. else:
  35. return import_string(key_func)
  36. return default_key_func

b、内存

  1. # 此缓存将内容保存至内存的变量中
  2. # 配置:
  3. CACHES = {
  4. 'default': {
  5. 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
  6. 'LOCATION': 'unique-snowflake', #unique-snowflake是起的一个变量名
  7. }
  8. }
  9. # 注:其他配置同开发调试版本

c、文件

  1. # 此缓存将内容保存至文件
  2. # 配置:
  3. CACHES = {
  4. 'default': {
  5. 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
  6. 'LOCATION': '/var/tmp/django_cache',
  7. }
  8. }
  9. # 注:其他配置同开发调试版本

d、数据库

  1. # 此缓存将内容保存至数据库
  2. # 配置:
  3. CACHES = {
  4. 'default': {
  5. 'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
  6. 'LOCATION': 'my_cache_table', # 数据库表
  7. }
  8. }
  9. # 注:执行创建表命令 python manage.py createcachetable

e、Memcache缓存(python-memcached模块)

  1. # 此缓存使用python-memcached模块连接memcache
  2. CACHES = {
  3. 'default': {
  4. 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
  5. 'LOCATION': '127.0.0.1:11211',
  6. }
  7. }
  8. CACHES = {
  9. 'default': {
  10. 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
  11. 'LOCATION': 'unix:/tmp/memcached.sock',
  12. }
  13. }
  14. CACHES = {
  15. 'default': {
  16. 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
  17. 'LOCATION': [
  18. '172.19.26.240:11211',
  19. '172.19.26.242:11211',
  20. ]
  21. }
  22. }

f、Memcache缓存(pylibmc模块)

  1. # 此缓存使用pylibmc模块连接memcache
  2. CACHES = {
  3. 'default': {
  4. 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
  5. 'LOCATION': '127.0.0.1:11211',
  6. }
  7. }
  8. CACHES = {
  9. 'default': {
  10. 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
  11. 'LOCATION': '/tmp/memcached.sock',
  12. }
  13. }
  14. CACHES = {
  15. 'default': {
  16. 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
  17. 'LOCATION': [
  18. '172.19.26.240:11211',
  19. '172.19.26.242:11211',
  20. ]
  21. }
  22. }

g. Redis缓存(依赖:pip3 install django-redis)

  1. CACHES = {
  2. "default": {
  3. "BACKEND": "django_redis.cache.RedisCache",
  4. "LOCATION": "redis://127.0.0.1:6379",
  5. "OPTIONS": {
  6. "CLIENT_CLASS": "django_redis.client.DefaultClient",
  7. "CONNECTION_POOL_KWARGS": {"max_connections": 100}
  8. # "PASSWORD": "密码",
  9. }
  10. }
  11. }

在views.py中的配置

  1. from django_redis import get_redis_connection
  2. conn = get_redis_connection("default")

2、应用

a. 全站使用

使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存

  1. MIDDLEWARE = [
  2. 'django.middleware.cache.UpdateCacheMiddleware',
  3. # 其他中间件...
  4. 'django.middleware.cache.FetchFromCacheMiddleware',
  5. ]
  6. CACHE_MIDDLEWARE_ALIAS = ""
  7. CACHE_MIDDLEWARE_SECONDS = ""
  8. CACHE_MIDDLEWARE_KEY_PREFIX = ""

b. 单独视图缓存

方式一:

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

方式二:

  1. from django.views.decorators.cache import cache_page
  2. urlpatterns = [
  3. url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
  4. ]

c、局部视图使用

a. 引入TemplateTag

  1. {% load cache %}

b. 使用缓存

  1. {% cache 5000 缓存key %}
  2. 缓存内容
  3. {% endcache %}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号