用于使用django缓存框架的备忘录装饰器的django实用程序。

django-cache-memoize的Python项目详细描述


主要功能

  • 带备忘的函数调用可能无效。
  • 使用非平凡参数和关键字参数
  • 通过回调深入了解缓存命中和缓存丢失。
  • 在存储函数时作为重复执行的"保护"使用的能力 结果不重要或不需要。

安装

pipinstalldjango-cache-memoize

用法

# Import the decoratorfromcache_memoizeimportcache_memoize# Attach decorator to cacheable function with a timeout of 100 seconds.@cache_memoize(100)defexpensive_function(start,end):returnrandom.randint(start,end)# Just a regular Django viewdefmyview(request):# If you run this view repeatedly you'll get the same# output every time for 100 seconds.returnhttp.HttpResponse(str(expensive_function(0,100)))

缓存使用django的默认缓存框架。最终,它要求 django.core.cache.cache.set(缓存键、函数输出、过期) 。 所以如果你有一个函数,它返回一些不能腌制的东西 缓存它将不起作用。

< Buff行情> 对于这种情况,django公开了一个简单的低级缓存api。你可以 使用此api在缓存中存储具有任意粒度级别的对象 你喜欢。您可以缓存任何可以安全pickle的python对象: 字符串、字典、模型对象列表等。(大多数 可以pickle公共python对象;请参阅python文档 有关腌制的更多信息。)

请参阅 文档

示例用法

这篇博文:如何使用django cache memoize

它与上面的使用示例类似,但是 细节。特别地,它展示了使用 django缓存备忘录 ,然后在之后将其添加到代码中。

高级用法

参数u重写

在内部,decorator将每个参数和关键字参数重写为 它包装成连接字符串的函数。你的第一件事 可能要做的是帮助decorator将参数重写为 更适合用作缓存键字符串。例如,假设您有实例 其方法不返回唯一值的类。例如:

classRecord(models.Model):name=models.CharField(max_length=100)lastname=models.CharField(max_length=100)friends=models.ManyToManyField(SomeOtherModel)def__str__(self):returnself.name# Example use:>>>record=Record.objects.create(name='Peter',lastname='Bengtsson')>>>print(record)Peter>>>record2=Record.objects.create(name='Peter',lastname='Different')>>>print(record2)Peter

这是一个虚构的例子,但基本上 您知道 str() 某些参数的转换是不安全的。然后你可以通过一个 调用args_rewrite>。它得到相同的位置参数和关键字参数 作为你装饰的功能。下面是一个实现示例:

fromcache_memoizeimportcache_memoizedefcount_friends_args_rewrite(record):# The 'id' is always unique. Use that instead of the default __str__returnrecord.id@cache_memoize(100,args_rewrite=count_friends_args_rewrite)defcount_friends(record):# Assume this is an expensive function that can be memoize cached.returnrecord.friends.all().count()
前缀

默认情况下,前缀成为函数的名称。考虑:

fromcache_memoizeimportcache_memoize@cache_memoize(10,prefix='randomness')deffunction1():returnrandom.random()@cache_memoize(10,prefix='randomness')deffunction2():# different name, same arguments, same functionalityreturnrandom.random()# Example use>>>function1()0.39403406043780986>>>function1()0.39403406043780986>>># ^ repeated of course>>>function2()0.39403406043780986>>># ^ because the prefix was forcibly the same, the cache key is the same

点击可调用

如果已设置,则使用原始参数和关键字调用的函数 参数 如果缓存能够找到并返回缓存命中。 例如,假设您希望每次都告诉您的 statsd 服务器 缓存命中。

fromcache_memoizeimportcache_memoizedef_cache_hit(user,**kwargs):statsdthing.incr(f'cachehit:{user.id}',1)@cache_memoize(10,hit_callable=_cache_hit)defcalculate_tax(user,tax=0.1):return...

可呼叫小姐

hit_callable的功能完全相同 如果它不是缓存命中,它就会被调用。

存储结果

如果有一个函数要确保只调用 每次超时过期一次,但实际上您不太关心 函数返回值是什么。也许因为你知道 函数返回一些可以快速填充 memcached的内容 也许你知道它会返回一些不能腌制的东西。那么你 可以将存储结果设置为false。这相当于你的功能 返回 真值

fromcache_memoizeimportcache_memoize@cache_memoize(1000,store_result=False)defsend_tax_returns(user):# something something time consuming...returnsome_none_pickleable_thingdefmyview(request):# View this view as much as you like the 'send_tax_returns' function# won't be called more than once every 1000 seconds.send_tax_returns(request.user)
缓存别名

缓存别名 参数允许您使用默认缓存以外的缓存。

# Given settings like:# CACHES = {#     'default': {...},#     'other': {...},# }@cache_memoize(1000,cache_alias='other')defmyfunc(start,end):returnrandom.random()

缓存失效

当您想"撤消"某些缓存时,只需调用函数 同样使用相同的参数,除了添加 。使函数无效。

fromcache_memoizeimportcache_memoize@cache_memoize(10)defexpensive_function(start,end):returnrandom.randint(start,end)>>>expensive_function(1,100)65>>>expensive_function(1,100)65>>>expensive_function(100,200)121>>>exensive_function.invalidate(1,200)>>>expensive_function(1,100)89>>>expensive_function(100,200)121

做同样事情的"别名"是传递一个名为 \u refresh=true 。像这样:

pipinstalldjango-cache-memoize
0

无法清除多个缓存密钥。在上面的例子中, 当你想宣告无效时,你必须知道"原始论点" 高速缓存。没有方法"搜索"与 特定模式。

兼容性

  • 巨蟒2.7、3.4、3.5、3.6
  • Django 1.8、1.9、1.10、1.11、2.0、2.1

查看 tox.ini文件,通过 测试覆盖范围。

现有技术

历史记录

mozilla symbol server 用django编写。这是一个Web服务 位于C++调试器和AWS S3之间。它洗牌符号文件进出 AWS S3。符号文件用于C++(以及其他编译语言) 源映射是用于javascript的。

这项服务的流量很大。下载流量(代理请求 对于s3)中的符号,每秒收到大约40个请求。因为大自然 在应用程序中,大多数都会导致404未找到,而是 在为每个文件请求aws s3时,这些查找被缓存在 高度配置的redis配置。此redis缓存也已连接 上传新文件的代码部分。

从Mozilla的构建中,新的上传文件以压缩文件包的形式到达 系统,每分钟大约600兆字节,每一个平均包含 每个大约100个文件。当一个新的上传进来时,我们需要快速 找出它是否存在于s3中,并且它会被缓存,因为通常是相同的文件 在不同的上传中重复。但是当一个文件被上传到s3时 我们需要快速而自信地使任何本地缓存失效。这样你 在没有任何过时的时间段的情况下,保持一个真正有攻击性的缓存。

这是为django cache memoize构建并在中测试的用例。 它最初是用DJ为Python3.6编写的安哥拉1.11但是 已提取,与Python2.7兼容,最早可追溯到Django 1.8。

django cache memoize 也用于 songsear.ch 中,用于缓存short 自动完成搜索输入中的查询。所有自动完成操作由 ElasticSearch,速度惊人,但不如memcached快。

"竞争"

已经有了由thomas vavrys编写的django memoize django memoize 。 它也可以作为您在django中使用的备忘录装饰器。而且它 使用默认缓存框架作为存储。它在 修饰函数以生成缓存密钥。

在运行django memoize和django cache memoize的基准测试中 我发现django cache memoize的平均速度要快4倍。

另一个关键区别是,django cache memoize使用 str() django memoize 在某些可变对象的情况下使用 repr() 。 (例如类实例)作为参数,缓存将不起作用。例如, 这在django备忘录中不起作用

pipinstalldjango-cache-memoize
1

但是,这是有效的…

pipinstalldjango-cache-memoize
2

开发

最基本的是克隆repo并运行:

pipinstalldjango-cache-memoize
3

代码样式全部为黑色

所有代码都必须用黑色格式化 最好的检查工具是 治疗师 因为它可以帮助你跑步 所有人,帮你修好东西,帮你确保林寻在 你这个蠢货。这个项目还使用flake8来检查其他东西 黑色无法检查。

要用毒性物质检查绒布,请使用:

pipinstalldjango-cache-memoize
4

要安装 治疗师 预提交挂钩,只需运行:

pipinstalldjango-cache-memoize
5

当你运行 治疗师运行 时,它只会检查你触摸过的文件。 要运行所有文件,请使用:

pipinstalldjango-cache-memoize
6

要解决所有/任何问题,请运行:

pipinstalldjango-cache-memoize
7

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用二进制搜索查找两个排序数组的所有公共元素   java应用程序在POJO之间不能有重复的代码块   java为什么私有构造函数可以工作而私有Setter不能在SPRING DI IOC中工作   接收并返回两种类型之一的java函数   java在每个测试用例之后清除内存中的数据库   java如何从Android视频录制中实时捕获逐帧图像   Java数据类(多文件管理)   java如何利用selenium抓住网站的价值   java每周或每月更改日期   Azure Cosmos DB Java SDK支持Spring Boot 2.4。十、   java为什么SLF4不显示来自JUL FINER消息的调试消息?   JAVAutil。扫描仪如何在Java中使用扫描仪读取文本文件?   java Hibernate可以读取Hibernate的内容。cfg。但是仍然会给出错误?