01-什么是缓存
缓存(cache),其作用是缓和较慢存储的高频次请求,简单来说,就是加速满存储的访问效率。
02-几种缓存配置
# 内存缓存:local-memory caching CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', } } # 文件系统缓存:filessystem caching CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tem/django_cache', } }
03-memcached应用
这是Django推荐的缓存系统,也是分布式内存对象缓存系统(注意,它的分布式逻辑在客户端)。Django内置支持,集成度比较好。
安装:
pip install python-memcached
配置settings.py
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '127.0.0.1:8000', ] } } # 在MIDDLEWARE中加上, MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', 'django.middleware.common.CommonMiddleware', ... 'django.middleware.cache.FetchFromCacheMiddleware', ]
在views.py
# 方法1: from django.views.decorators.cache import cache_page # 首页 60*15表示缓存15分钟 @cache_page(60*15) def index(request): pass # 方法2:直接在路由urls.py中实现 from django.views.decorators.cache import cache_page urlpatterns = [ path('index/', cache_page(60*15)(views.index)), ]
如果只想缓存某个字段的话
from django.core.cache import cache def test(request): key = '我是缓存值' time= 60 result= cache.get(key) if not result: result = '' cache.set(key, result, time) return result
04-配置Redis缓存
# 安装包 pip install django-redis==4.9.0 pip install hiredis==0.2.0
同时安装了hiredis,其作用是提升Redis解析性能。
在settings.py配置缓存
REDIS_URL = '127.0.0.1:6379:1' CCACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': REDIS_URL, 'TIMEOUT': '300', 'OPTIONS': { # 'PASSWORD': '对应的密码', 'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'PARSER_CLASS': 'redis.connection.HiredisParser', }, 'CONNECTION_POOL_CLASS': 'redis.connection.BlockingConnectionPool', } }
05-缓存的粒度
5.1 整站缓存
# 直接在settings.py的MIDDLEWARE中的第一行增加 'django.middleware.cache.UpdateCacheMiddleware', # 但一般不这么用
5.2 整个页面的缓存
缓存url
5.3 局部数据缓存
函数缓存的用法,只需要增加装饰器即可。比如:Model层的Post.hot_posts的更新频率不高,那么可以进行比较长的缓存。
from django.core.cache import cache class Post(models.Model): @classmethod def hot_posts(self): result = cache.get('hot_posts') if not result: result = cls.objects.filter(status=cls.STATUS_NORMAL).order_by('-pv') cache.set('hot_posts', result, 10*60) return result
如果需要缓存部分的模板数据时。可以这么做,比如缓存50s。
{% load cache %}
{% cache 50 sidebar %}
...sidebar...
{% endcache %}
此时只需要把要缓存的内容用cache标签抱起来即可。