有多种实现缓存的方法。
我们可以在Python进程中创建本地数据结构来构建缓存,或者将缓存作为服务器,充当代理并为请求提供服务。
有一些内置的Python工具,比如使用functools库中的cached_property装饰器。我想通过提供缓存装饰器属性的概述来介绍缓存的实现。
下面的代码片段说明了缓存属性是如何工作的。
from functools import cached_propertyclass FinTech: @cached_property def run(self): return list(range(1,100))
结果,FinTech().run现在被缓存,range(1100)的输出将只生成一次。然而,在实际场景中,我们几乎不需要缓存属性。
让我们回顾一下其他方法。
1. 字典的方法
对于简单的用例,我们可以创建/使用映射数据结构,如字典,我们可以保存在内存中,并使其在全局框架上可访问。
有多种方法来实现它。最简单的方法是创建一个单例样式的模块,例如config.py
在配置。我们可以创建一个dictionary类型的字段,在开始时填充一次。从那时起,可以使用dictionary字段来获取结果。
2. 最近使用的算法
我们可以使用Python的内置特性LRU。
LRU代表最近最少使用的算法。LRU可以缓存函数的返回值,这些返回值依赖于传递给函数的参数。
LRU在递归CPU绑定操作中特别有用。
它本质上是一个装饰器:@lru_cache(maxsize, typed),我们可以用它来装饰函数。
maxsize告诉装饰器缓存的最大大小。如果我们不想设置大小,那么只需将其设置为None。
typed用于指示是否要将输出缓存为可以比较不同类型值的相同值。
当我们期望相同的输入产生相同的输出时,这是有效的。
将所有数据保存在应用程序的内存中可能会带来麻烦。
在具有多个进程的分布式应用程序中,这可能会成为一个问题,因为不适合将所有结果缓存到所有进程的内存中。
一个很好的用例是应用程序运行在一个机器集群上。我们可以将缓存作为一种服务托管。
3.缓存即服务
第三种选择是将缓存数据作为外部服务托管。该服务可以负责存储所有请求和响应。
所有应用程序都可以通过缓存服务检索数据。它就像一个代理。
假设我们正在构建一个和Wikipedia一样大的应用程序,它将同时或并行地服务1000个请求。
我们需要一个缓存机制,并希望在服务器之间分布缓存。
我们可以使用memcache并缓存数据。
Memcached在Linux和Windows中非常流行,因为:
我们需要安装一个叫做pymemcache的python库。
Memcache要求数据以字符串或二进制形式存储。因此,我们必须序列化缓存的对象,并在需要检索它们时反序列化它们。
代码片段展示了如何启动和使用memcache:
client = Client(host, serialiser, deserialiser)client.set(‘blog’: {‘name’:’caching’, ‘publication’:’fintechexplained’}}blog = client.get(‘blog’)