天天看点

网站性能优化俩大技术:页面静态化和缓存数据

对网站本身性能进行优化,可以减少数据的查询的次数,一定程度上防止恶意攻击:DDOS(黑客控制很多电脑同时访问)

一、页面静态化

页面静态化:把原本动态的页面处理结果保存成html文件,让用户直接访问这个生成出来的静态的html页面,而不需要动态的去重新请求这个页面以及不需要页面视图需要重新请求数据库, 这个可以用在未登录用户显示的同样界面上页面静态化,登入的用户就需要使用动态的页面处理结果。

当管理员修改首页表使用表中的数据时,就应该重新更改静态页面的数据,这个可以利用该应用中admin.py定义的模型管理类中save_model()函数以及delete_model()函数来实现,当一个模型类的数据修改或添加时,会自动调用save_model()该方法;当一个模型类的数据删除时,会自动调用delete_model()该方法。

对于静态html页面的生成,可以通过celery异步处理来实现,就跟发送邮件等待对方激活时不需要等待对方确认,让celery服务器来继续处理。这里也一样,当页面数据修改的时候,就调用celery中的tasks任务来,让celery服务器来处理下面的内容,而不需要管理员花费时间等待静态html页面的生成。

class BaseModelAdmin(admin.ModelAdmin):
    """admin管理器类"""
    def save_model(self, request, obj, form, change):
        """新增或更新表中的数据时自动调用"""
        super().save_model(request, obj, form, change)

        # 发出任务,让celery worker重新生成首页静态页面
        from celery_tasks.tasks import generate_static_index_html
        generate_static_index_html()

        # 清楚首页的缓存数据
        cache.delete("index_page_date")

    def delete_model(self, request, obj):
        """删除表中的数据时自动调用"""
        super().delete_model(request, obj)

        # 发出任务,让celery worker重新生成静态页面
        from celery_tasks.tasks import generate_static_index_html
        generate_static_index_html()

        # 清楚首页的缓存数据
        cache.delete("index_page_date")
           
二、使用缓存

将处理计算的结果先临时保存起来,下次使用的时候可以先直接使用,如果没有这个备份的数据,重新进行计算处理,将缓存数据保存在内存中, 一般在首页的图片这个样的数据,基本都是一样的,这里就可以用到缓存数据, 缓存要设置有效期, 秒为单位

from django.core.cache import cache
 # 尝试从缓存中获取数据
        context = cache.get("index_page_date")
        if context is None:
            # 缓存中没有数据
			# 省略获取types、goods_banners、promotion_banners信息流程
            context = {
                'types': types,
                'goods_banners': goods_banners,
                "promotion_banners": promotion_banners
            }

            # 设置缓存
            cache.set("index_page_date", context, 3600)
           

当如果修改了数据库的数据,直接删除缓存

from django.core.cache import cache
class BaseModelAdmin(admin.ModelAdmin):
    """admin管理器类"""
    def save_model(self, request, obj, form, change):
        """新增或更新表中的数据时自动调用"""
        super().save_model(request, obj, form, change)

        # 发出任务,让celery worker重新生成首页静态页面
        from celery_tasks.tasks import generate_static_index_html
        generate_static_index_html()

        # 清楚首页的缓存数据
        cache.delete("index_page_date")

    def delete_model(self, request, obj):
        """删除表中的数据时自动调用"""
        super().delete_model(request, obj)

        # 发出任务,让celery worker重新生成静态页面
        from celery_tasks.tasks import generate_static_index_html
        generate_static_index_html()

        # 清楚首页的缓存数据
        cache.delete("index_page_date")