当用户请求到达Django的视图后,视图会先从数据库读取数据传递给模板进行渲染,返回给用户看到的网页。
如果用户每次请求都从数据库读取数据并渲染,将极大降低性能,不仅服务器压力大,而且客户端也无法即时获得响应。如果能将数据库中读取的数据或动态生成的网页放到速度更快的缓存中,每次有请求过来,先检查缓存中是否有对应的资源,如果有,直接从缓存中取出来返回响应,节省读取数据和渲染的时间,不仅能大大提高系统性能,还能提高用户体验。
使用 Django 的内置缓存框架
1.在 settings.py 中配置缓存后端
# settings.py
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
}
}
2.在视图函数中使用缓存
from django.core.cache import cache
def home(request):
# 尝试从缓存中读取页面内容
page_content = cache.get('home_page')
if page_content is not None:
# 如果缓存中有内容,则直接返回
return HttpResponse(page_content)
# 如果缓存中没有内容,则生成页面内容
# ...
# 在生成页面内容后,将其保存到缓存中
cache.set('home_page', page_content, timeout=300) # 设置缓存过期时间为 5 分钟
return HttpResponse(page_content)
这里使用了 Django 缓存框架中的 cache 对象来读取和保存缓存。如果缓存中没有内容,则执行生成页面内容的逻辑,并将其保存到缓存中。
这样,当用户访问主页时,会首先尝试从缓存中读取页面内容,如果缓存中有内容,则直接返回;否则,执行生成页面内容的逻辑,并将其保存到缓存中,下一次再访问时可以直接从缓存中读取,从而提高页面响应速度。
使用 Redis 缓存
1.安装 redis:
pip install redis
pip install django-redis
2.在 Django 项目的 settings.py 中配置 Redis 缓存:
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/0',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
其中,LOCATION 参数指定 Redis 的地址和端口号,OPTIONS 参数可以根据需要配置,这里使用了默认值。
3.启动redis
redis-cli.exe -h 127.0.0.1 -p 6379
4.在视图中使用 Redis 缓存:
# views.py
from django.core.cache import cache
from django.shortcuts import render
def your_view(request):
# 尝试从缓存中获取数据
cached_data = cache.get('your_cache_key')
if cached_data is None:
# 如果缓存中没有数据,执行耗时操作并存入缓存
# 例如:cached_data = your_expensive_operation()
cache.set('your_cache_key', cached_data, timeout=3600) # 设置缓存过期时间
return render(request, 'your_template.html', {'data': cached_data})
区别:
后端存储方式:
Django 内置缓存框架使用内存 (LocMemCache) 存储数据,适合开发和测试环境。
Redis 是一个独立的缓存服务器,提供高性能的分布式缓存。
性能和可扩展性:
Redis 提供更好的性能和可扩展性,尤其适用于大型和高流量的应用。
Django 内置缓存框架对于小型应用或开发阶段可能足够。
数据持久性:
Redis 支持数据持久性,可以将缓存数据持久化到磁盘。
Django 内置缓存框架在内存中存储,重启应用或服务器后缓存数据会丢失。
需要注意的是,缓存也有一定的缺点,比如缓存过期时间过短或过长都会导致缓存效果不佳,还有可能会出现缓存穿透等问题。因此,在使用缓存时需要根据实际情况选择合适的缓存策略,并进行适当的监控和维护。