python 装饰器 &应用,【缓存】
装饰器是什么,有什么功能,能用在什么业务场景?: https://blog.csdn.net/u010967872/article/details/80329280
一、装饰器全解:
https://taizilongxu.gitbooks.io/stackoverflow-about-python/content/3/README.html
面向切面编程(AOP)
是一种编程思想,与OOP并不矛盾,只是它们的关注点相同。面向对象的目的在于抽象和管理,而面向切面的目的在于解耦和复用。
AOP在少量增加代码复杂度的前提下,显著的获得以下优点:
1、使得功能逻辑和业务逻辑解耦,功能和业务的修改完全独立,代码结构清晰,开发方便
2、一键注入,代码复用程度高,扩展方便
二、python中类作为装饰器:
https://blog.csdn.net/qq_29767317/article/details/80799410
三、应用场景:
1.可以在外层函数加上时间计算函数,计算函数运行时间;
2.计算函数运行次数;
3.可以用在框架的路由传参上;
4.插入日志,作为函数的运行日志;
5.事务处理,可以让函数实现事务的一致性,让函数要么一起运行成功,要么一起运行失败;
6.缓存,实现缓存处理;
7.权限的校验,在函数外层套上权限校验的代码,实现权限校验;
四、缓存
在web开发中,缓存是经常用来提高服务器的响应速度以及减少数据库压力的用力手段。在处理缓存时,有三个重要的步骤生成缓存键,存入缓存和获取缓存数据。对于不同的缓存软件(Redis,Memcached等)操作基本相同,只是在具体的存储获取环节存在差异,所以将常用的缓存处理过程封装成一个装饰器类(CacheDecorator下文给出实现代码)。通过装饰器类可以派生出基于不同缓存软件的具体缓存装饰器类如RedisCacheDecorator,MemcacheCacheDecorator等。
python 缓存装饰器
Python缓存装饰器类适用于redis,memcached和dict对象等
python用装饰器实现缓存函数执行结果
import time import hashlib import pickle cache = {} def is_obsolete(entry,duration): d = time.time()-entry['time'] return d>duration def compute_key(function,args,kwargs): key = pickle.dumps((function.func_name,args,kwargs)) return hashlib.sha1(key).hexdigest() def memoize(duration=10): def _memorize(function): def __memorize(*args,**kwargs): key = compute_key(function,args,kwargs) if key in cache and not is_obsolete(cache[key],duration): print 'we got a winner' return cache[key][ 'value'] result = function(*args,**kwargs) cache[key] = { 'value':result, 'time':time.time()} return result return __memorize return _memorize
#!/usr/bin/env python #coding=utf-8 '''装饰器版的python自动缓存系统,使用redis持久化数据库''' import hashlib import pickle import redis from functools import wraps r = redis.Redis(host="localhost",port=6379,db=0) def _compute_key(function, args,kw): '''序列化并求其哈希值''' key = pickle.dumps((function.func_name,args,kw)) return hashlib.sha1(key).hexdigest() def memorize(duration = -1): '''自动缓存''' def _memoize(function): @wraps(function) # 自动复制函数信息 def __memoize(*args, **kw): key = _compute_key(function, args, kw) #是否已缓存? if r.exists(key): try: # 判断存在和返回之间还有一段时间,可能造成key不存在 return r[key] except: pass # 运行函数 result = function(*args, **kw) #保存结果 r[key] = result r.expire(key,duration) return result return __memoize return _memoize
在Python中使用AOP实现Redis缓存示例
Flask扩展系列(六)–缓存
五、简单聊聊Python中的wraps修饰器
python装饰器的wraps作用: https://blog.csdn.net/hqzxsc2006/article/details/50337865