最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用Python的Tornado框架結(jié)合memcached頁(yè)面改善博客性能

 更新時(shí)間:2015年04月24日 11:08:48   作者:C Wong  
這篇文章主要介紹了用Python的Tornado框架結(jié)合memcached頁(yè)面改善vLog性能,主要使用到了緩存來(lái)提升性能,需要的朋友可以參考下

原因

Blog是一個(gè)更新并不很頻繁的一套系統(tǒng),但是每次刷新頁(yè)面都要更新數(shù)據(jù)庫(kù)反而很浪費(fèi)資源,添加靜態(tài)頁(yè)面生成是一個(gè)解決辦法,同時(shí)緩存是一個(gè)更好的主意,可以結(jié)合Memcached添加少量的代碼進(jìn)行緩存,而且免去去了每次更新文章都要重新生成靜態(tài)頁(yè)面,特別當(dāng)頁(yè)面特別多時(shí).
實(shí)現(xiàn)

主要通過(guò)頁(yè)面的uri進(jìn)行緩存,結(jié)合tornado.web.RequestHandler的prepare和on_finish方法函數(shù), prepare 主要是請(qǐng)求前執(zhí)行,on_finish()是請(qǐng)求結(jié)束之前執(zhí)行.在渲染模板時(shí)緩存頁(yè)面內(nèi)容,然后在請(qǐng)求前檢測(cè)是否有緩存,如果有直接輸出緩存,結(jié)束請(qǐng)求,在POST提交之后清空所有緩存,重新生成緩存,從而保證內(nèi)容實(shí)時(shí)性.由于登錄用戶和普通用戶的頁(yè)面不相同,所以不緩存登錄用戶頁(yè)面(代碼中沒(méi)有體現(xiàn),請(qǐng)自行實(shí)現(xiàn)).主要python代碼(省略了模板渲染的代碼):

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
#  Author :  cold
#  E-mail :  wh_linux@126.com
#  Date  :  13/01/14 09:57:31
#  Desc  :  
#
import config
import pylibmc
from tornado.web import RequestHandler
#### 省略Cache類定義 #####

class Memcached(object):
  _mc = pylibmc.client.Client(config.CACHE_HOST, binary = True)

  def __enter__(self):
    if config.CACHED:
      return Memcached
    else:
      return Cache()

  def __exit__(self, exc_type, exc_val, exc_tb):
    pass

  @classmethod
  def get_cache(cls):
    return cls._mc

  @classmethod
  def get(cls, key, default = None):
    r = cls._mc.get(key)
    if not r:
      r = default
    return r

  @classmethod
  def set(cls, key, value, timeout = 0):
    timeout = timeout if timeout else config.CACHE_TIMEOUT
    return cls._mc.set(key, value, timeout)

  @classmethod
  def delete(cls, key):
    return cls._mc.delete(key)

  @classmethod
  def flush(cls):
    return cls._mc.flush_all()

  def __getattr__(self, key):
    return Memcached.get(key)

  def __setattr__(self, key, value):
    return Memcached.set(key, value)


class BaseHandler(RequestHandler):
  """ 繼承tornado請(qǐng)求基類,重寫(xiě) prepare和on_finish方法 """
  cache = Memcached

  def render(self, template_path, *args, **kwargs):
    """ 渲染模板 """
    # 省略渲染模板代碼
    content = ''   # 渲染模板后的內(nèi)容
    if self.request.method == "GET" and CACHED and \
      not self.request.path.startswith("/admin"):
      self.cache.set(self.request.uri, content) # 將渲染后的內(nèi)容緩存起來(lái)
    self.write(content)

  def prepare(self):
    super(BaseHandler, self).prepare()
    # 如果請(qǐng)求是GET方法,而且不是請(qǐng)求后臺(tái)
    if self.request.method == "GET" and CACHED and \
      not self.request.path.startswith("/admin"):

      # 嘗試獲取當(dāng)前頁(yè)面的緩存
      cache = self.cache.get(self.request.uri)
      # 獲取緩存則輸出頁(yè)面,結(jié)束請(qǐng)求
      if cache:
        return self.finish(cache)

  def on_finish(self):
    """ 重寫(xiě)結(jié)束請(qǐng)求前的方法函數(shù) """
    if self.request.method == "POST":
      # 如果遇到POST提交則清空緩存
      self.cache.flush()

緩存系統(tǒng)在redis和Memcached選擇了很久,因?yàn)橹皇菃渭兊木彺骓?yè)面所以最后選擇了memcached,使用pylibmc python庫(kù).
測(cè)試

使用webbench 網(wǎng)站壓力測(cè)試對(duì)比了緩存前后的結(jié)果: 使用緩存前

$ webbench -c 500 -t 30 http://www.linuxzen.com/
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://www.linuxzen.com/
500 clients, running 30 sec.

Speed=54 pages/min, 38160 bytes/sec.
Requests: 27 susceed, 0 failed.

使用緩存后:

$ webbench -c 500 -t 30 http://www.linuxzen.com/
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://www.linuxzen.com/
500 clients, running 30 sec.

Speed=256 pages/min, 238544 bytes/sec.
Requests: 128 susceed, 0 failed.

明顯快了很多...

相關(guān)文章

  • Python閉包實(shí)現(xiàn)計(jì)數(shù)器的方法

    Python閉包實(shí)現(xiàn)計(jì)數(shù)器的方法

    這篇文章主要介紹了Python閉包實(shí)現(xiàn)計(jì)數(shù)器的方法,分析了閉包的概念及實(shí)現(xiàn)計(jì)數(shù)器的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 深入淺析python with語(yǔ)句簡(jiǎn)介

    深入淺析python with語(yǔ)句簡(jiǎn)介

    with 語(yǔ)句適用于對(duì)資源進(jìn)行訪問(wèn)的場(chǎng)合,確保不管使用過(guò)程中是否發(fā)生異常都會(huì)執(zhí)行必要的“清理”操作,釋放資源,這篇文章給大家介紹了python with語(yǔ)句簡(jiǎn)介,感興趣的朋友一起看看吧
    2018-04-04
  • Python用正則表達(dá)式實(shí)現(xiàn)爬取古詩(shī)文網(wǎng)站信息

    Python用正則表達(dá)式實(shí)現(xiàn)爬取古詩(shī)文網(wǎng)站信息

    這篇文章主要給大家介紹了關(guān)于Python如何利用正則表達(dá)式爬取爬取古詩(shī)文網(wǎng)站信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • Python編程基礎(chǔ)之構(gòu)造方法和析構(gòu)方法詳解

    Python編程基礎(chǔ)之構(gòu)造方法和析構(gòu)方法詳解

    這篇文章主要為大家詳細(xì)介紹了Python的構(gòu)造方法和析構(gòu)方法,使用Python編程基礎(chǔ),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • pandas實(shí)戰(zhàn):分析三國(guó)志人物示例實(shí)現(xiàn)

    pandas實(shí)戰(zhàn):分析三國(guó)志人物示例實(shí)現(xiàn)

    這篇文章主要介紹了pandas實(shí)戰(zhàn):分析三國(guó)志人物示例實(shí)現(xiàn),本文章內(nèi)容詳細(xì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,需要的朋友可以參考下
    2023-01-01
  • flask 實(shí)現(xiàn)上傳圖片并縮放作為頭像的例子

    flask 實(shí)現(xiàn)上傳圖片并縮放作為頭像的例子

    今天小編就為大家分享一篇flask 實(shí)現(xiàn)上傳圖片并縮放作為頭像的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Pandas替換及部分替換(replace)實(shí)現(xiàn)流程詳解

    Pandas替換及部分替換(replace)實(shí)現(xiàn)流程詳解

    這篇文章主要介紹了Pandas替換及部分替換(replace)實(shí)現(xiàn)流程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 在Pandas中給多層索引降級(jí)的方法

    在Pandas中給多層索引降級(jí)的方法

    今天小編就為大家分享一篇在Pandas中給多層索引降級(jí)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • 基于Python實(shí)現(xiàn)文件處理程序

    基于Python實(shí)現(xiàn)文件處理程序

    這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的文件處理程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Python3.0 實(shí)現(xiàn)決策樹(shù)算法的流程

    Python3.0 實(shí)現(xiàn)決策樹(shù)算法的流程

    這篇文章主要介紹了Python3.0 實(shí)現(xiàn)決策樹(shù)算法的流程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08

最新評(píng)論

延长县| 大港区| 亳州市| 台南市| 谢通门县| 江安县| 临沧市| 香港| 阿克陶县| 长岭县| 鄂尔多斯市| 交口县| 博白县| 冷水江市| 天水市| 晋城| 五常市| 芜湖县| 富锦市| 襄垣县| 台湾省| 尉犁县| 汕头市| 密山市| 太原市| 兰坪| 平舆县| 炉霍县| 体育| 安西县| 永泰县| 体育| 泸水县| 万安县| 南通市| 定安县| 大连市| 保靖县| 临清市| 乌兰察布市| 利津县|