本文主要介绍了在Django框架中,设置Redis作为后端缓存数据的方式
对于动态网站来说,对于用户每次的请求,web服务器都会进行各种计算。
就拿网站首页来说,我要做的处理包括,对于/index,路由到匹配的视图函数,查询首页涉及到的数据表,并将查询结果封装成上下文给到模板,模板里再进行处理,渲染。
这就是完整的首页展示流程。短时间内少次处理这样的请求,我们的web服务器还扛得住,可一旦并发数上来,对网站的性能就是极大的考研,用户体验也会大大下降,这就是缓存的勇武之地了。
而同时,网站的首页,对于大部分用户,不管是否登录,都会展示相同的页面。而首页的数据,也是运营人员通过后台管理页面添加进数据库的,变动不会很频繁。综上,对网站首页的缓存就显得有用且必要,并且后端研发人员,也应该有性能优化,尽可能减少数据库查询次数的意识,所以缓存必须掌握。
我采用Redis数据库配置成缓存cache后端。
Redis是内存级数据库,读写极快,适合作为网站缓存。
Django支持多种缓存方式,在此不再赘述,如有需要,请移步官方文档
https://docs.djangoproject.com/en/2.1/topics/cache/
(1)安装
pip install django-redis
(2)settings文件配置
在settings.py文件中添加如下代码
# Django的缓存配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/9",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
这里我使用的是本机Redis数据库,index为9的数据表
(3)视图函数中的调用
1.导入方式:
from django.core.cache import cache
2.调用方式:
第一次访问/index时,cache中没有键“index_page_data”,于是进行下面的业务逻辑处理,查询数据库拿出数据,封装成上下文context,返回给前端。以后再访问/index,就用cache里读取key的value就可以了。
class IndexView(View):
def get(self, request):
'''显示首页'''
# 尝试从缓存中获取数据
context = cache.get('index_page_data')
if not context:
print('设置缓存')
# 业务逻辑
# 组织模板上下文
context = {
#从数据库查询到的数据,以key-value形式存储
}
# 设置缓存
# key value timeout
cache.set('index_page_data', context, 3600)
# 使用模板
return render(request, 'index.html', context)
3.什么时候更改缓存
当运营人员通过Django-admin后台管理页面,对数据库进行增删改查的操作后,涉及到首页的数据,那首页显示必将发生变化,此时应删除缓存。这时代码进行到
context = cache.get('index_page_data')
缓存中不再有“index_page_data”这个键,context返回None,此时进行下面的业务逻辑,进行数据库查询,查出最近数据返回给前端展示。
于是我们在对应的应用app的admin.py中,应做如下更改:
from django.core.cache import cache
class BaseModelAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
'''新增或更新表中的数据时调用'''
super(BaseModelAdmin, self).save_model(request, obj, form, change)
# 清除首页的缓存数据
cache.delete('index_page_data')
def delete_model(self, request, obj):
'''删除表中的数据时调用'''
super(BaseModelAdmin, self).delete_model(request, obj)
# 清除首页的缓存数据
cache.delete('index_page_data')
新建类 BaseModelAdmin 继承自 admin.ModelAdmin,增删改的时候,直接原封不动的调用父类的方法,再方法末尾,进行cache的删除键的操作,以达到更新首页的目的。
然后其他模型管理类,直接继承BaseModelAdmin 即可。
就像这样
class GoodsTypeAdmin(BaseModelAdmin):
pass
class IndexGoodsBannerAdmin(BaseModelAdmin):
pass
class IndexTypeGoodsBannerAdmin(BaseModelAdmin):
pass
class IndexPromotionBannerAdmin(BaseModelAdmin):
pass
admin.site.register(GoodsType, GoodsTypeAdmin)
admin.site.register(IndexGoodsBanner, IndexGoodsBannerAdmin)
admin.site.register(IndexTypeGoodsBanner, IndexTypeGoodsBannerAdmin)
admin.site.register(IndexPromotionBanner, IndexPromotionBannerAdmin)
至此,Django中配置并使用Redis作为首页缓存的流程已全部给出,读者可以参照方法,给出了首页的其他地方添加缓存,如有不足,欢迎指正。
Best wishes
北邮Renyi