文章目录

  • 简介
  • 安装
  • 基本概念
    • 缓存
  • 初试
  • 测试时间
  • 最大整数
  • 使用MongoDB
  • 删除缓存
  • 封装
  • 异步缓存
  • 参考文献

简介

Beaker 是一个高速缓存和会话库,用于 Web 应用和独立 Python 脚本。

Beaker 附带 WSGI 中间件,可在基于 WSGI 的 Web 应用中直接使用。

Beaker 带有缓存装饰器,可在任何 Python 应用中使用。

Beaker 最初基于Perl Cache::Cache模块,进行了大量的更新和重写。

特性:

  • 延迟加载
  • 高性能
  • 多后端
    基于文件、DBM文件、memcached、内存、Redis、MongoDB、数据库等
  • 基于Cookie会话
  • 灵活的缓存
    每个函数可以使用不同的过期时间和不同的键将数据缓存到不同的后端
  • 可扩展后端

缺点:

  • 不支持异步缓存

PS:本文偏向于缓存而非会话。

安装

pip install beaker

基本概念

Beaker 能以不同方式配置,首推使用字典,传递给 SessionMiddlewareCacheManager

缓存

使用Beaker的缓存有三种方式:

  1. 编程API(传统)
    公开名称空间并检索缓存对象,该缓存对象处理键值。
  2. 缓存装饰器(推荐)
  3. cache_region() 装饰器(更灵活)

初试

test.txt

Hello World!

方式1. 编程API

from beaker.cache import CacheManager
from beaker.util import parse_cache_config_options# 1. 实例化CacheManager
cache_opts = {'cache.type': 'file','cache.data_dir': '/tmp/cache/data','cache.lock_dir': '/tmp/cache/lock'
}cache = CacheManager(**parse_cache_config_options(cache_opts))def get_data(filename):'''获取数据的方式'''print(filename)with open(filename) as f:return f.read()def get_results():'''要缓存的函数'''data = get_data(filename)return dataif __name__ == '__main__':# 2. 通过编程API使用缓存temp_cache = cache.get_cache('temp', type='file', expire=10)  # 实例化一个缓存,命名空间为temp,使用文件缓存,过期时间为10s# 3. 创建&读取缓存filename = 'test.txt'results = temp_cache.get(key=filename, createfunc=get_results)print(results)# temp_cache.clear()  # 删除所有缓存# temp_cache.remove_value(key=filename)  # 删除特定缓存

效果

方式2. 缓存装饰器

from beaker.cache import CacheManager
from beaker.util import parse_cache_config_options# 1. 实例化CacheManager
cache_opts = {'cache.type': 'file','cache.data_dir': '/tmp/cache/data','cache.lock_dir': '/tmp/cache/lock'
}cache = CacheManager(**parse_cache_config_options(cache_opts))def get_data(filename):'''获取数据的方式'''print(filename)with open(filename) as f:return f.read()# 2. 通过装饰器使用缓存
@cache.cache('temp', type='file', expire=10)
def get_results(filename):'''要缓存的函数'''data = get_data(filename)return dataif __name__ == '__main__':# 3. 创建&读取缓存filename = 'test.txt'results = get_results(filename)print(results)# cache.invalidate(get_results, 'temp', filename, type='file')  # 删除特定缓存

测试时间

递归计算n=35的斐波那契数列

import time
from beaker.cache import CacheManager
from beaker.util import parse_cache_config_optionscache_opts = {'cache.type': 'file','cache.data_dir': '/tmp/cache/data','cache.lock_dir': '/tmp/cache/lock'
}cache = CacheManager(**parse_cache_config_options(cache_opts))def fib1(n):'''不带缓存的斐波那契数列'''if n < 2:return nreturn fib1(n - 1) + fib1(n - 2)@cache.cache('temp', type='file', expire=60)
def fib2(n):'''带缓存的斐波那契数列'''if n < 2:return nreturn fib2(n - 1) + fib2(n - 2)if __name__ == '__main__':beg = time.time()result1 = [fib1(i) for i in range(35)]print('{:.2f} s'.format(time.time() - beg))beg = time.time()result2 = [fib2(i) for i in range(35)]print('{:.2f} s'.format(time.time() - beg))# 5.25 s# 0.04 s

最大整数

import sysprint(sys.maxsize)

可作永久缓存

使用MongoDB

beaker.ext.mongodb

from beaker.cache import CacheManager
from beaker.util import parse_cache_config_optionscache_opts = {'cache.type': 'ext:mongodb','cache.url': 'mongodb://localhost:27017/cache',  # 本机MongoDB,数据库名cache'cache.expire': 10  # 过期时间
}cache = CacheManager(**parse_cache_config_options(cache_opts))@cache.cache('fib')
def fib(n):if n < 2:return nreturn fib(n - 1) + fib(n - 2)if __name__ == '__main__':result = [fib(i) for i in range(35)]print(result)# fib(1)  # 延迟清缓存

过期时间为10s,只要一直不运行,这些记录都会保存,即延迟加载。

过了10s后调用 fib(1),将会清除过期缓存,库中数据只剩一个新的。

删除缓存

调用 cache.invalidate(函数名, ('Cache名', *args.values()), type='file')

import time
from pathlib import Path
from beaker.cache import CacheManager
from beaker.util import parse_cache_config_optionscache_opts = {'cache.type': 'file','cache.data_dir': Path(__file__).parent / 'cache/data',  # 当前目录'cache.lock_dir': Path(__file__).parent / 'cache/lock'
}cache = CacheManager(**parse_cache_config_options(cache_opts))@cache.cache('fun', type='file', expire=60 * 5)
def fun(a, b, c):time.sleep(a + b + c)return a + b + cif __name__ == '__main__':# 1.函数参数args = dict(a=0.2, b=0.3, c=0.5)# 1.首次运行beg = time.time()fun(**args)print(time.time() - beg)# 2.再次运行beg = time.time()fun(**args)print(time.time() - beg)# 3.删除对应缓存cache.invalidate(fun, 'fun', *args.values(), type='file')# 4.重新运行beg = time.time()fun(**args)print(time.time() - beg)# 1.003999# 0.000999# 1.000999

封装

import sys
from pathlib import Path
from beaker.cache import CacheManager
from beaker.util import parse_cache_config_optionscache_opts = {'cache.type': 'file','cache.data_dir': Path(__file__).parent / 'cache/data',  # 当前目录'cache.lock_dir': Path(__file__).parent / 'cache/lock'
}cache = CacheManager(**parse_cache_config_options(cache_opts))def delete_cache(func, args, type='file'):'''删除特定缓存:param func: 调用的函数:param args: 调用的具体参数:param type: 缓存类型'''cache.invalidate(func, func.__name__, *args.values(), type=type)@cache.cache('fib', type='file', expire=sys.maxsize)  # 永久缓存,建议同函数名
def fib(n):if n < 2:return nreturn fib(n - 1) + fib(n - 2)if __name__ == '__main__':result = [fib(i) for i in range(35)]print(result)

异步缓存

异步缓存如何实现? Beaker 通过 NamespaceManager 进行缓存的读、写、锁操作,保证唯一性。

如MongoDB后端,可以观察到其 _id 是根据调用的绝对路径和参数决定的,那么只要保证 _id 一致,即可实现分布式缓存。

但这样做可能丧失唯一性。

推荐阅读

  1. Python中的缓存
  2. 缓存使用过程中的五种策略总结及优缺点组合分析
  3. Asynchronous Caching with Python
  4. aiocache: Asyncio cache manager for redis, memcached and memory

参考文献

  1. Beaker Documentation
  2. Beaker GitHub
  3. WSGI接口
  4. 会话和缓存配置
  5. Asynchronous Caching with Python
  6. aiocache: Asyncio cache manager for redis, memcached and memory

Python高速缓存和会话库——Beaker相关推荐

  1. 干货丨Python常用的1000+库大盘点

    Python常用库 Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主要用于在终端或浏览器端 ...

  2. Python全家福,这些库你认识哪些?

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...

  3. Python 常用的标准库以及第三方库有哪些?

    Python常用库大全,看看有没有你需要的. 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具 ...

  4. Python 常用的标准库以及第三方库

    作者:史豹 链接:https://www.zhihu.com/question/20501628/answer/223340838 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  5. python常用的第三方库

    20个必不可少的Python库也是基本的第三方库 读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们是: Requests.Kenneth Reitz ...

  6. python测试开发工具库汇总

    https://github.com/china-testing/python-api-tesing/blob/master/books.md 有相关书籍下载! Web UI测试自动化 splinte ...

  7. Python测试 ——开发工具库

    Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...

  8. 可爱的python测试开发库(python测试开发工具库汇总)

    2019独角兽企业重金招聘Python工程师标准>>> 欢迎转载,转载请注明来源: github地址 谢谢点赞 本文地址 Python测试开发库 参考资料 https://githu ...

  9. Python常用的标准库以及第三方库有哪些?

    20个必不可少的Python库也是基本的第三方库 读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们是: Requests.Kenneth Reitz ...

  10. Python常用的标准库以及第三方库

    20个必不可少的Python库也是基本的第三方库 常用工具的Python库,他们是: Requests.Kenneth Reitz写的最富盛名的http库.每个Python程序员都应该有它. Scra ...

最新文章

  1. rsyslog+loganalyzer+evtsys搭建集中式监控系统
  2. MYSQL ROOT权限丢失的解决方法
  3. 【TensorFlow-windows】学习笔记八——简化网络书写
  4. Top命令找出CPU占用较高的Java线程信息
  5. micropython开发idethonny_Thonny 3.0 首个稳定版发布,一个面向初学者的 Python IDE
  6. CentOS下rpm命令详解
  7. java 绘制动态小球_JavaScript动画实例:动感小球
  8. 宿主机docker容器互传文件命令
  9. poj-2393 Yogurt factory (贪心)
  10. H5制作哪家强?四大H5页面制作工具大比拼
  11. centos freeradius mysql_CentOS 5.7安装FreeRADIUS 1.1.3+MySQL 5.0.77结合RouteOS
  12. ora-00959(表空间不存在) 的另一种可能性
  13. 支付宝-生成二维码实现url,实现支付
  14. wow服务器人数最新统计,魔兽世界怀旧服服务器人数统计 魔兽世界怀旧服人数比例查询...
  15. 某android广告SDK逆向分析总结
  16. 大华摄像头离线故障:要拔除SD卡
  17. 我们都需要时间,成为更好的人(转载)
  18. 解决VMware16无法在Win7安装VMTools的问题,报Windows 无法验证此驱动程序软件的发布者
  19. 精彩的javascript代码(包括表单校验等等)
  20. 【HaaS Python 硬件积木】INA219电压电流计

热门文章

  1. Python读取Excel数据并进行函数拟合
  2. php制作国旗头像图片,不要再@微信官方了,自己动手一秒制作国旗头像
  3. Python爬虫-爬取豆瓣TOP250
  4. 微信开发者工具调试H5项目报错:XXXXfail, the permission value is offline verifying解决方案
  5. 怎么用python将日期转化为数字_python转化excel数字日期为标准日期操作
  6. vue3里面app.config.globalProperties的使用
  7. 魔方cfop公式软件_【番外篇】八大魔方快速还原法图解介绍汇总大全!
  8. Unity DOTS Burst 运行分析
  9. java提取jks文件提取私钥_如何从JKS文件中取出PEM格式证书
  10. 丹佛机场行李系统案例分析