网站优化的关键技术:页面静态化和缓存

来源:互联网 发布:什么是编程环境 编辑:程序博客网 时间:2024/06/05 18:44

网页静态化就是通过生成HTML文件的方式,让用户尽可能多的访问HTML文件,而不是老是调用数据库生成网页。这样可以降低服务器的负载。生成网页的语句其实很简单,可以分为2部分,第一部分是组织模板:

context ={}里面放入需要传到网页的内容

temp = loader.get_template('static_index.html')   static_index.html是已经写好的网页模板,里面需要填入context里的东西,然后就能展示了。

static_html = temp.render(context)   这个会返回一个字符串,里面就是合成好的网页内容。

save_path = os.path.join(settings.BASE_DIR, 'static/index.html')
    with open(save_path, 'w') as f:
        f.write(static_html)

上面的代码就是把合成好的内容写入文件,这样html文件就生成好了。


接下来,就是显示了。这里大家应该知道,一般情况,如果是用Nginx的话,80端口用于访问html文件,8888端口用于访问连接数据库的服务器。设置数据库的文件是:

  1. server {  
  2.   listen 80;  
  3.   server_name localhost;  
  4.   #charset koi8-r;  
  5.   #access_log logs/host.access.log main;  
  6.   location / {  
  7.     #这里设置你的实际路径  
  8.     root /home/;   
  9.     index index.html index.htm;  
  10.     }  
  11. }  
最后,就是异步的问题。为什么要异步呢?因为生成网页是需要时间的,而这个任务不应该影响其他任务的正常进行。异步,就是把任务分开执行。网站分出一个线程来做网页的生成。其实就是多线程。

这里我们选择用celery来做这个。用celery的好处就是执行异步任务的服务器和网站服务器可以不在一台机子上。

app = Celery('celery_tasks.tasks', broker='redis://172.16.179.142:6379/9')

# 定义任务函数
@app.task

def generate_static_index_html():

这里写入生成网页的代码。具体的代码我就省略了,大家只要写好模板,并从服务器里读出context就OK了。

P.S:有人或许会问,在什么时候调用异步任务呢?这个如果是Django的话,需要在admin页面里重写一个class BaseAdmin(admin.ModelAdmin):在这个类里,重写save_model和delete_model方法。在重写的代码中,加入我们的异步方法,也就是:generate_static_index_html.delay(),这句话会告诉电脑,有个任务要你去做,然后celery就会异步执行了。


下面,说一下缓存。

一个主页,并不是所有部分都需要反复从数据库里读取。需要更新的,可能只是用户名什么的。那么,剩下的,不需要老更新的,我们可以把它存到缓存里。

cache.set('index_page_data', context, 3600),这句话会在缓存中建立一对键值,就是把context保存到index_page_data中,然后保存3600秒。context里的东西,应该就是网页不需要频繁更改的内容。

context = cache.get('index_page_data')是从缓存中读取内容。在实际应用中,大家可以先读,然后判断是否为空,如果为空,那么就需要调用数据库,生产context,然后保存进缓存。这样,当用户再调用的时候,因为缓存中已经有内容了,就不会再调用数据库了。

# 配置redis作为django的缓存
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        # 指定缓存数据保存在哪一个数据库中
        "LOCATION": "redis://127.0.0.1:6379/10",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}



原创粉丝点击