Django 提供6种缓存方式
(1)开发调式缓存
(2)内存缓存
(3)文件缓存
(4)数据库缓存
(5)Memcache缓存(使用Python-memcached模块)
(6)Memcache缓存(使用pylibmc模块)
常用的缓存方式是 文件缓存 和 Memcache缓存
1. Django开发调式缓存
from django.views.decorators.cache import cache_page # 缓存装饰器
# method_decorator可以用来装饰方法,使用方法多种,
# 详细见:https://docs.djangoproject.com/en/3.0/topics/class-based-views/intro/
from django.utils.decorators import method_decorator
class GetBookView(View):
"""
获取单个图书
"""
@method_decorator(cache_page(3)) # 表示缓存使用3秒,3秒后再查询数据库
def get(self,request,id):
book=Books.objects.filter(id=id).first()
print(book.pv)
book.pv+=1
book.save()
return render(request,'book.html',{'t':book})
这种缓存,项目一旦上线缓存功能就会消失,原因是Django默认的缓存配置是开发调式模式,如果需要在上线后继续使用缓存功能,就需要在setting.py中添加配置代码,用来指定缓存的存储方式。
2. 缓存位置的选择
(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)内存缓存
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 指定缓存使用的引擎
'LOCATION': 'unique-snowflake', # 写在内存中的变量的唯一值
'TIMEOUT':300, # 缓存超时时间(默认为300秒,None表示永不过期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
(3)文件缓存
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎
'LOCATION': '/var/tmp/django_cache', #指定缓存的路径
'TIMEOUT':300, #缓存超时时间(默认为300秒,None表示永不过期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
(4)数据库缓存
创建缓存的数据库表使用语句: python manage.py createcachetable
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 指定缓存使用的引擎
'LOCATION': 'cache_table', # 数据库表
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
(5)Memcache缓存(使用 Python-memcached 模块 连接Memcache)
Memcached 是Django原生支持的缓存系统。
要使用Memcached ,需要下载Memcached的支持库 Python-memcached 或pylibmc
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎
'LOCATION': '222.169.10.100:11211', # 指定Memcache缓存服务器的IP地址和端口
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
'LOCATION': 'unix:/tmp/memcached.sock', # 指定局域网内的主机名加socket套接字为Memcache缓存服务器
'LOCATION': [ # 指定一台或多台其他主机ip地址加端口为Memcache缓存服务器
'222.169.10.100:11211',
'222.169.10.101:11211',
'222.169.10.102:11211',
]
LOCATION 也可以配置成上图所示
(6)Memcache缓存(使用 pylibmc 模块)
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', # 指定缓存使用的引擎
'LOCATION':'192.168.10.100:11211', # 指定本机的11211端口为Memcache缓存服务器
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
},
}
}
'LOCATION': '/tmp/memcached.sock', # 指定某个路径为缓存目录
'LOCATION': [ # 分布式缓存,在多台服务器上运行Memcached进程,程序会把多台服务器当作一个单独的缓存,而不会在每台服务器上复制缓存值
'192.168.10.100:11211',
'192.168.10.101:11211',
'192.168.10.102:11211',
]
LOCATION 也可以配置成上图所示
注意: Memcached是基于内存的缓存,数据存储在内存当中,如果服务器宕机,数据就会丢失,所以Memcached一般与其他缓存配合使用
3 Django REST framework 实现缓存机制
(1) pip install drf-extensions
(2) 在settings.py中配置
# DRF扩展
REST_FRAMEWORK_EXTENSIONS = {
# 缓存时间
'DEFAULT_CACHE_RESPONSE_TIMEOUT': 6
# 缓存位置, 与配置文件中的CACHES的键对应
'DEFAULT_USE_CACHE': 'default',
}
(3)添加缓存机制
1. 用mixin的方法
from django.shortcuts import render
from .models import Goods
from .serializers import GoodsModelSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework_extensions.cache.mixins import CacheResponseMixin
# Create your views here.
class GetGoodListView(CacheResponseMixin,APIView):
"""
获取商品列表
"""
def get(self,request):
good_list=Goods.objects.all()
re=GoodsModelSerializer(good_list,many=True)
return Response(re.data)
2. 用装饰器的方法
from django.shortcuts import render
from .models import Goods
from .serializers import GoodsModelSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework_extensions.cache.mixins import CacheResponseMixin
from rest_framework_extensions.cache.decorators import cache_response
# Create your views here.
class GetGoodListView(APIView):
"""
获取商品列表
"""
@cache_response(timeout=60*60, cache='default')
def get(self,request):
good_list=Goods.objects.all()
re=GoodsModelSerializer(good_list,many=True)
return Response(re.data)
没有增加缓存机制时, 访问耗时是84ms, 加了之后是34ms。 速度提升了一两倍
缓存的应用多用于 判断用户的文件夹和文件大小的接口。 因为判断文件这些非常占用IO资源。
4. 使用非关系型数据库 Redis
(1)确保redis服务器在运行。
(2)安装django-redis依赖: pip install django-redis
(3) 在settings.py中增加配置代码
# 配置Redis缓存
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
# 如果redis server 设置了密码,则写成 "LOCATION": "密码@redis://127.0.0.1:6379",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}