vLog使用Tornado框架结合memcached缓存页面
原因 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()
缓存系统在redis
和Memcached
选择了很久,因为只是单纯的缓存页面所以最后选择了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.
明显快了很多...
原文地址:vLog使用Tornado框架结合memcached缓存页面, 感谢原作者分享。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds











Le Sony ZV-E10 II a déjà été divulgué comme étant disponible au premier semestre 2024, et bien que le lancement initial était apparemment prévu pour le mois de mai, il a apparemment été retardé. Une nouvelle fuite partagée par le prolifique leaker Andrea Pizzini, soi-disant originaire

L'évaluation du rapport coût/performance du support commercial pour un framework Java implique les étapes suivantes : Déterminer le niveau d'assurance requis et les garanties de l'accord de niveau de service (SLA). L’expérience et l’expertise de l’équipe d’appui à la recherche. Envisagez des services supplémentaires tels que les mises à niveau, le dépannage et l'optimisation des performances. Évaluez les coûts de support commercial par rapport à l’atténuation des risques et à une efficacité accrue.

BitgetLaunchpool est une plateforme dynamique conçue pour tous les passionnés de cryptomonnaie. BitgetLaunchpool se démarque par son produit unique. Ici, vous pouvez miser vos jetons pour débloquer plus de récompenses, notamment des parachutages, des rendements élevés et une généreuse cagnotte exclusive aux premiers participants. Qu’est-ce que BitgetLaunchpool ? BitgetLaunchpool est une plate-forme de crypto-monnaie où les jetons peuvent être mis en jeu et gagnés selon des termes et conditions conviviaux. En investissant du BGB ou d'autres jetons dans Launchpool, les utilisateurs ont la possibilité de recevoir des airdrops gratuits, des gains et de participer à de généreux pools de bonus. Les revenus des actifs gagés sont calculés en T+1 heures, et les récompenses sont basées sur

La courbe d'apprentissage d'un framework PHP dépend de la maîtrise du langage, de la complexité du framework, de la qualité de la documentation et du support de la communauté. La courbe d'apprentissage des frameworks PHP est plus élevée par rapport aux frameworks Python et inférieure par rapport aux frameworks Ruby. Par rapport aux frameworks Java, les frameworks PHP ont une courbe d'apprentissage modérée mais un temps de démarrage plus court.

Le framework PHP léger améliore les performances des applications grâce à une petite taille et une faible consommation de ressources. Ses fonctionnalités incluent : une petite taille, un démarrage rapide, une faible utilisation de la mémoire, une vitesse de réponse et un débit améliorés et une consommation de ressources réduite. Cas pratique : SlimFramework crée une API REST, seulement 500 Ko, une réactivité élevée et un débit élevé.

La rédaction d'une documentation claire et complète est cruciale pour le framework Golang. Les meilleures pratiques incluent le respect d'un style de documentation établi, tel que le Go Coding Style Guide de Google. Utilisez une structure organisationnelle claire, comprenant des titres, des sous-titres et des listes, et fournissez la navigation. Fournit des informations complètes et précises, notamment des guides de démarrage, des références API et des concepts. Utilisez des exemples de code pour illustrer les concepts et l'utilisation. Maintenez la documentation à jour, suivez les modifications et documentez les nouvelles fonctionnalités. Fournir une assistance et des ressources communautaires telles que des problèmes et des forums GitHub. Créez des exemples pratiques, tels que la documentation API.

Choisissez le meilleur framework Go en fonction des scénarios d'application : tenez compte du type d'application, des fonctionnalités du langage, des exigences de performances et de l'écosystème. Frameworks Go courants : Gin (application Web), Echo (service Web), Fibre (haut débit), gorm (ORM), fasthttp (vitesse). Cas pratique : construction de l'API REST (Fiber) et interaction avec la base de données (gorm). Choisissez un framework : choisissez fasthttp pour les performances clés, Gin/Echo pour les applications Web flexibles et gorm pour l'interaction avec la base de données.

Feuille de route d'apprentissage du framework Java pour différents domaines : Développement Web : SpringBoot et PlayFramework. Couche de persistance : Hibernate et JPA. Programmation réactive côté serveur : ReactorCore et SpringWebFlux. Informatique temps réel : ApacheStorm et ApacheSpark. Cloud computing : AWS SDK pour Java et Google Cloud Java.
