转载:http://50vip.com/435.html
A python Function / Method OUTPUT cache system base on function Decorators.
基本信息
github 地址:https://github.com/hustcc/wrapcache
使用场景
经常会在某些很小的场合需要缓存一些数据,提高一些性能,而这种缓存又不是经常需要,比如:
-
两个进程共享数据库,其中只读进程读取数据做一些操作,这个时候,可以将数据库内容缓存一下,避免重复读数据库;
-
一个web页面数据太多,然而页面并不需要完全的实时性,这个时候就可以将页面内容完全缓存,在过期时间之后,不读数据库,不进行大量计算,这种在一些报告页面非常常见。
这两个场景其实挺常见的,要完成也不难,无非就是存到python 字段,加一个时间戳,判断过期,如果是redis,就直接存redis,并赋予timeout时间就ok了。
自己因为经常遇到这种场景,所以将其封装成一个python库,方便使用。
如何使用
使用简单,只需要要在方法上面加一个装饰器即可缓存,并且设置缓存过期时间。
1
2
3
4
|
import
wrapcache
@wrapcache
.wrapcache(timeout
=
60
)
def
need_cache_function(
input
, t
=
2
, o
=
3
): sleep(
2
)
return
random.randint(
1
,
100
)
|
以上即可,第一次运行需要 2 秒,第二次运行(过期时间 60 秒之内)瞬间给出缓存结果。适合于小场景的方法缓存。
安装方法
-
首先
pip install wrapcache
,支持python2和python3。 -
然后
import wrapcache
。 -
最后在需要缓存的方法上加上装饰器即可
@wrapcache.wrapcache(timeout = 3)
其中 @wrapcache.wrapcache(timeout = 3, adapter = RedisAdapter) 有两个参数:
-
timeout
, 过期时间,默认为-1,不缓存数据 -
adapter
,存储器,默认为MemoryAdapter(存到python的全局字典中),可选RedisAdapter(存储到redis中)
注意:如果选择adapter = RedisAdapter,则需要在使用前设置redis市里 调用 RedisAdapter.db = redis_instance
1
2
3
|
REDIS_CACHE_POOL
=
redis.ConnectionPool(host
=
'xx.xxx.xx.xxx'
, port
=
6379
, password
=
'redis_pwd'
, db
=
2
)
REDIS_CACHE_INST
=
redis.Redis(connection_pool
=
REDIS_CACHE_POOL, charset
=
'utf8'
)
RedisAdapter.db
=
REDIS_CACHE_INST
#初始化装饰器缓存
|
TODO
目前是使用内存 dict 和 redis 存储缓存,后续要支持将 memcached 等服务器中,只需要补充 adapter 中代码,实现对应方法即可
。
欢迎 push requst 和 issue 。