Django中提供的6种缓存方式详解

yipeiwu_com6年前Python基础

前言

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

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

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

1、配置

a、开发调试

# 此为开始调试用,实际内部不做任何操作
  # 配置:
    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

b、内存

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

c、文件

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

d、数据库

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

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

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

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

CACHES = {
  "default": {
    "BACKEND": "django_redis.cache.RedisCache",
    "LOCATION": "redis://127.0.0.1:6379",
    "OPTIONS": {
      "CLIENT_CLASS": "django_redis.client.DefaultClient",
      "CONNECTION_POOL_KWARGS": {"max_connections": 100}
      # "PASSWORD": "密码",
    }
  }
}

在views.py中的配置

from django_redis import get_redis_connection
conn = get_redis_connection("default")

2、应用

a. 全站使用

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

  MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',
    # 其他中间件...
    'django.middleware.cache.FetchFromCacheMiddleware',
  ]
  CACHE_MIDDLEWARE_ALIAS = ""
  CACHE_MIDDLEWARE_SECONDS = ""
  CACHE_MIDDLEWARE_KEY_PREFIX = ""

b. 单独视图缓存

方式一:

    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)),
    ]

c、局部视图使用

a. 引入TemplateTag

    {% load cache %}

b. 使用缓存

    {% cache 5000 缓存key %}
      缓存内容
    {% endcache %}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

pandas 获取季度,月度,年度首尾日期的方法

可实现类似于sql中的dateadd、datesub的功能 两种获取日期的方式 z=datetime.datetime(2016,12,5) z=datetime.datetime....

Django实现跨域的2种方法

jsonp 方式一:指定返回方法 # 后端 def view(request): callback = request.GET.get('callback') return...

详解tensorflow训练自己的数据集实现CNN图像分类

详解tensorflow训练自己的数据集实现CNN图像分类

利用卷积神经网络训练图像数据分为以下几个步骤 1.读取图片文件 2.产生用于训练的批次 3.定义训练的模型(包括初始化参数,卷积、池化层等参数、网络) 4.训练 1 读取图片文件...

python实现随机梯度下降法

python实现随机梯度下降法

看这篇文章前强烈建议你看看上一篇python实现梯度下降法: 一、为什么要提出随机梯度下降算法 注意看梯度下降法权值的更新方式(推导过程在上一篇文章中有)  也就是说每次更新...

python快速排序代码实例

一、 算法描述: 1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。 &...