Python web-Django 配置使用Redis作为后端缓存

Python web-Django 配置使用Redis作为后端缓存

本文主要介绍了在Django框架中,设置Redis作为后端缓存数据的方式

1. 为什么要用缓存?

对于动态网站来说,对于用户每次的请求,web服务器都会进行各种计算。

就拿网站首页来说,我要做的处理包括,对于/index,路由到匹配的视图函数,查询首页涉及到的数据表,并将查询结果封装成上下文给到模板,模板里再进行处理,渲染。

这就是完整的首页展示流程。短时间内少次处理这样的请求,我们的web服务器还扛得住,可一旦并发数上来,对网站的性能就是极大的考研,用户体验也会大大下降,这就是缓存的勇武之地了。

而同时,网站的首页,对于大部分用户,不管是否登录,都会展示相同的页面。而首页的数据,也是运营人员通过后台管理页面添加进数据库的,变动不会很频繁。综上,对网站首页的缓存就显得有用且必要,并且后端研发人员,也应该有性能优化,尽可能减少数据库查询次数的意识,所以缓存必须掌握。

2.Django支持的缓存方式

我采用Redis数据库配置成缓存cache后端。

Redis是内存级数据库,读写极快,适合作为网站缓存。

Django支持多种缓存方式,在此不再赘述,如有需要,请移步官方文档
https://docs.djangoproject.com/en/2.1/topics/cache/

3.使用&配置

(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)

4.总结

至此,Django中配置并使用Redis作为首页缓存的流程已全部给出,读者可以参照方法,给出了首页的其他地方添加缓存,如有不足,欢迎指正。

Best wishes
北邮Renyi

你可能感兴趣的:(后端技术栈)