Django的缓存机制

Django是动态网站,每次请求都会数据库中进行相应的操作。当访问量很大时,耗时就会增加。
缓存将某个views的返回值保存至内存或者memcache中,在设置的时间内,再有访问过来时,就不再执行view中的操作,而是直接从缓存中取值
缓存机制:每次有请求进来,先去看缓存是否有,有且未过期,直接拿值 
      如果缓存没有或者已过期,就要走视图,走数据库 

Django中提供了6种缓存方式:
    1.虚拟缓存
    2.memchched缓存
    3. 数据库缓存
    4. 文件系统缓存
    5.本地内存缓存
    6.自定义缓存

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

2.Memcached缓存
    最快的,最高效的缓存系统,django提供原生支持,所有数据都存在内存
    1.基于python-memcached模块
    此缓存使用python-memcached模块连接memcache

  CACHES = {
'default': {
   'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
   'LOCATION': [
      '172.19.26.240:11211',
      '172.19.26.242:11211',
      '172.19.26.244:11213',
       ]
    }
   }
   2.此缓存使用pylibmc模块连接memcache
    CACHES = {
       'default': {
           'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
           'LOCATION': [
               '172.19.26.240:11211',
               '172.19.26.242:11211',
           ]
       }
   }
   不足:缓存完全在内存中,一旦服务器崩溃,所有的数据将不复存在
3.数据库缓存
    使用数据库缓存,需要在数据库中建立一个用于缓存的数据库表

 

python manage.py createcachetable [cache_table_name]
CACHES = {
'default': {
    'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
    'LOCATION': 'my_cache_table',
}
数据库缓存使用的是你配置文件中的数据库,(如DATABASES中是mysql,缓存使用的就是mysql数据库)

4.文件系统缓存

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/var/tmp/django_cache',
        #'LOCATION': 'c:/foo/bar',#windows下的示例
    }
}
LOCATION设置为缓存所在的位置,注意是绝对位置同时必须保证服务器对列出的路径具有读写权限

5.本地内存缓存:
    想具有内存缓存的优点但有没有能力运行Memcached的时候,可以考虑本地内存缓存
    特点:每个进程和线程都是安全的

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake'
    }
}
LOCATION用来区分每个内存存储,如果只有一个本地内存缓存,你可以忽略这个设置
不足:每个进程都有自己的私有缓存实例,本地内存缓存效率不是特别高,建议只是在内部开发测时使用

6.自定义缓存:

如使用redis缓存:
1.安装 pip install django-redis
2.在stting中配置CACHES,可以设置多个缓存,根据名字使用
        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": "密码",
                }
            }
        },
        #另添加缓存
        "JERD": { }
3.根据名字去连接池中获取连接
        from django_redis import get_redis_connection
        conn = get_redis_connection("default")

django缓存的设置:

1.全站缓存
MIDDLEWARE_CLASSES = (
    ‘django.middleware.cache.UpdateCacheMiddleware’, #第一
    其他中间件
    ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后
)
CACHE_MIDDLEWARE_ALIAS = "" 用于存储的缓存别名.
CACHE_MIDDLEWARE_SECONDS = "" 每个页面的缓存秒数.
CACHE_MIDDLEWARE_KEY_PREFIX = "" 唯一的字符串
2.视图缓存
    from django.views.decorators.cache import cache_page
    import time
    @cache_page(15)          #超时时间为15秒
    def my_view(request):
        t=time.time()      #获取当前时间
        return render(request,"index.html",locals())
    如果多个URL指向同样的视图,每个URL会单独缓存。/foo/1/请求和/foo/23/请求会各自单独缓存
     urlpatterns = [
            url(r'^foo/([0-9]{1,2})/$', my_view),
    ]
    1.默认情况下使用的缓存是CACHES设置里的缓存
    2.URLconf里定制视图级缓存
    from django.views.decorators.cache import cache_page:
        urlpatterns = [
            url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
        ]
    应用场景:在另外一个很少使用缓存的站点重用视图函数,或者想将视图发布给另一个不使用缓存的人使用  
    def my_view(request):
        t=time.time()      #获取当前时间
        return render(request,"index.html",locals())

# 模板缓存
{% load cache %}
<h3 style="color: green">不缓存:-----{{ t }}</h3>
{% cache 2 'name' %} # 存的key 
    <h3>缓存:-----:{{ t }}</h3>
{% endcache %}
{% cache 500 sidebar %}缓存超时时间(以秒计)和指定缓存片段的名称
缓存基于片段的动态内容的多份拷贝。 比如为上一个例子的每个用户分别缓存侧边栏
{% load cache %}
{% cache 500 sidebar request.user.username %}
  .. sidebar for logged in user ..
{% endcache %}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值