찾다
데이터 베이스MySQL 튜토리얼vLog使用Tornado框架结合memcached缓存页面

vLog使用Tornado框架结合memcached缓存页面

Jun 07, 2016 pm 04:29 PM
memcachetornadovlog사용액자결합하다

原因 Blog是一个更新并不很频繁的一套系统,但是每次刷新页面都要更新数据库反而很浪费资源,添加静态页面生成是一个解决办法,同时缓存是一个更好的主意,可以结合Memcached添加少量的代码进行缓存,而且免去去了每次更新文章都要重新生成静态页面,特别当页面特

原因

Blog是一个更新并不很频繁的一套系统,但是每次刷新页面都要更新数据库反而很浪费资源,添加静态页面生成是一个解决办法,同时缓存是一个更好的主意,可以结合Memcached添加少量的代码进行缓存,而且免去去了每次更新文章都要重新生成静态页面,特别当页面特别多时.

实现

主要通过页面的uri进行缓存,结合tornado.web.RequestHandler的prepare和on_finish方法函数, prepare 主要是请求前执行,on_finish()是请求结束之前执行.在渲染模板时缓存页面内容,然后在请求前检测是否有缓存,如果有直接输出缓存,结束请求,在POST提交之后清空所有缓存,重新生成缓存,从而保证内容实时性.由于登录用户和普通用户的页面不相同,所以不缓存登录用户页面(代码中没有体现,请自行实现).主要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请求基类,重写 prepare和on_finish方法 """
    cache = Memcached
    def render(self, template_path, *args, **kwargs):
        """ 渲染模板 """
        # 省略渲染模板代码
        content = ''     # 渲染模板后的内容
        if self.request.method == "GET" and CACHED and \
           not self.request.path.startswith("/admin"):
            self.cache.set(self.request.uri, content) # 将渲染后的内容缓存起来
        self.write(content)
    def prepare(self):
        super(BaseHandler, self).prepare()
        # 如果请求是GET方法,而且不是请求后台
        if self.request.method == "GET" and CACHED and \
           not self.request.path.startswith("/admin"):
            # 尝试获取当前页面的缓存
            cache = self.cache.get(self.request.uri)
            # 获取缓存则输出页面,结束请求
            if cache:
                return self.finish(cache)
    def on_finish(self):
        """ 重写结束请求前的方法函数 """
        if self.request.method == "POST":
            # 如果遇到POST提交则清空缓存
            self.cache.flush()

缓存系统在redisMemcached选择了很久,因为只是单纯的缓存页面所以最后选择了memcached,使用pylibmc python库.

测试

使用webbench 网站压力测试对比了缓存前后的结果: 使用缓存前

$ 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.

明显快了很多...

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
MySQL 문자열 유형 : 스토리지, 성능 및 모범 사례MySQL 문자열 유형 : 스토리지, 성능 및 모범 사례May 10, 2025 am 12:02 AM

mysqlStringTypESmpactStorageAndperformanceAsfollows : 1) charisfixed, adlaysamestoragespace.

MySQL 문자열 유형 이해 : Varchar, Text, Char 등MySQL 문자열 유형 이해 : Varchar, Text, Char 등May 10, 2025 am 12:02 AM

mysqlstringtypesincludevarchar, text, char, enum, and set.1) varcharisversatileforvariable-lengthstringsupciedlimit.2) textisidealforlargetextStorage whithoudfinedlength.3) charisfixed, witableforconsistentDatalikecodes.4)

MySQL의 문자열 데이터 유형은 무엇입니까?MySQL의 문자열 데이터 유형은 무엇입니까?May 10, 2025 am 12:01 AM

mysqloffersvariousstringdatatatypes : 1) charfixed-lengthstrings, 2) varcharforvariable-lengthtext, 3) binaryandvarbinaryforbinarydata, 4) blobandtextforlargedata 및 5) enumandsetforcontrolledInput.achtolledinput.CheachorciCificusessandperististicatististicatististics

새로운 MySQL 사용자에게 권한을 부여하는 방법새로운 MySQL 사용자에게 권한을 부여하는 방법May 09, 2025 am 12:16 AM

TograntpermissionSt

MySQL에서 사용자를 추가하는 방법 : 단계별 가이드MySQL에서 사용자를 추가하는 방법 : 단계별 가이드May 09, 2025 am 12:14 AM

ToadDuserSinMySqleFeffectially, 다음에 따르면, 다음 사항을 따르십시오

MySQL : 복잡한 권한이있는 새 사용자 추가MySQL : 복잡한 권한이있는 새 사용자 추가May 09, 2025 am 12:09 AM

toaddanewuser와 함께 complexpermissionsinmysql, followthesesteps : 1) createShereuser'NewUser '@'localhost'Identifiedby'pa ssword ';. 2) grantreadaccesstoalltablesin'mydatabase'withgrantselectonmydatabase.to'newuser'@'localhost';. 3) GrantWriteAccessto '

MySQL : 문자열 데이터 유형 및 콜라주MySQL : 문자열 데이터 유형 및 콜라주May 09, 2025 am 12:08 AM

MySQL의 문자열 데이터 유형에는 char, varchar, binary, varbinary, blob 및 텍스트가 포함됩니다. 콜라이트는 문자열의 비교와 분류를 결정합니다. 1. 차량은 고정 길이 스트링에 적합하고 Varchar는 가변 길이 스트링에 적합합니다. 2. 이진 및 바이너리는 이진 데이터에 사용되며 Blob 및 텍스트는 큰 객체 데이터에 사용됩니다. 3. UTF8MB4_UNICODE_CI와 같은 정렬 규칙은 상류 및 소문자를 무시하며 사용자 이름에 적합합니다. UTF8MB4_BIN은 사례에 민감하며 정확한 비교가 필요한 필드에 적합합니다.

MySQL : Varchars에는 몇 개의 길이를 사용해야합니까?MySQL : Varchars에는 몇 개의 길이를 사용해야합니까?May 09, 2025 am 12:06 AM

가장 좋은 mysqlvarchar 열 길이 선택은 데이터 분석을 기반으로하고, 향후 성장을 고려하고, 성능 영향을 평가하고, 문자 세트 요구 사항을 기반으로해야합니다. 1) 일반적인 길이를 결정하기 위해 데이터를 분석합니다. 2) 미래 확장 공간을 예약하십시오. 3) 성능에 대한 큰 길이의 영향에주의를 기울이십시오. 4) 문자 세트가 스토리지에 미치는 영향을 고려하십시오. 이러한 단계를 통해 데이터베이스의 효율성과 확장 성을 최적화 할 수 있습니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.