前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >高级Python技术:如何在Python应用程序中实现缓存

高级Python技术:如何在Python应用程序中实现缓存

作者头像
HuangWeiAI
发布于 2021-02-05 02:48:49
发布于 2021-02-05 02:48:49
1.7K00
代码可运行
举报
文章被收录于专栏:浊酒清味浊酒清味
运行总次数:0
代码可运行

缓存的重要性

缓存对于每个Python程序员来说都是一个需要理解的重要概念。

简而言之,缓存的概念主要是利用编程技术将数据存储在临时位置,而不是每次都从源检索数据。

随后,缓存可以提高应用程序的性能,因为从临时位置访问数据比每次从源(如数据库、web服务等)获取数据更快。

本文旨在解释Python中的缓存是如何工作的。

为什么我们需要实现缓存?

要理解缓存是什么以及为什么需要缓存,请考虑下面的场景。

我们正在用Python构建一个应用程序,它将向最终用户显示产品列表。这个应用程序每天会被超过100个用户多次访问。应用程序将托管在应用程序服务器上,并且可以在internet上访问它。产品将存储在一个数据库中,该数据库将安装在数据库服务器上。因此,应用服务器将查询数据库以获取相关记录。

下图演示了我们的目标应用程序是如何设置的:

问题

从数据库获取数据是一个io绑定操作。因此,它的本性是缓慢的。如果频繁发送请求,而响应更新不频繁,那么我们可以将响应缓存到应用程序的内存中。

我们可以缓存结果,而不是每次都查询数据库,如下所示:

获取数据的请求必须通过线路,响应必须通过线路返回。

这在本质上是缓慢的。因此,引入了缓存。

我们可以缓存结果,以减少计算时间和节省计算机资源。

缓存是一个临时存储位置。它以惰性加载方式工作。

最初,缓存是空的。当应用程序服务器从数据库服务器获取数据时,它将用所需的数据集填充缓存。从那时起,后续的请求将从缓存获取数据,而不是一路到应用程序服务器。

我们还需要及时使缓存失效,以确保向最终用户显示最新的信息。

这就引出了本文的下一节:缓存规则。

缓存规则

在我看来,缓存有三条规则。

在启用缓存之前,我们需要执行分析应用程序的关键步骤。

因此,在应用程序中引入缓存之前的第一步是对应用程序进行概要分析。只有这样,我们才能了解每个函数需要多长时间以及它被调用了多少次。分析过程完成后,我们需要确定需要缓存的内容。

我们需要一种机制来连接函数的输入和输出,并将它们存储在内存中。这就引出了缓存的第一条规则。

1. 缓存的第一条规则:

第一个规则是确保目标函数需要很长时间才能返回输出,它经常被执行,并且函数的输出不会经常改变。

我们不希望为那些不需要很长时间就能完成的函数、在应用程序中很少被调用的函数或那些返回结果却在源代码中频繁更改的函数引入缓存。

这是一个需要记住的重要规则。

适合缓存的候选者:频繁调用的函数,输出不经常改变,执行需要很长时间

作为一个实例,如果一个函数执行了100次,并且函数需要很长时间才能返回结果,并且对于给定的输入它返回相同的结果,那么我们可以缓存结果。

然而,如果一个函数返回的值更新每一秒在源得到请求执行函数每分钟然后理解真的很重要我们需要缓存结果是否会最终将陈旧的数据发送给用户。这可以帮助我们理解我们是否需要缓存,或者我们是否需要不同的通信通道、数据结构或序列化机制来更快地检索数据,例如通过在套接字上使用二进制序列化器发送数据,而不是使用http上的xml序列化。

此外,知道什么时候使缓存失效,什么时候用新数据重新加载缓存也很重要。

2. 第二个规则:

第二条规则是确保从引入的缓存机制获取数据比执行目标函数更快。

只有当从缓存中检索结果的时间比从数据源检索数据的时间快时,我们才应该引入缓存。

缓存应该比从当前数据源获取数据快

因此,选择合适的数据结构(如字典或LRU缓存)作为实例是至关重要的。

3.第三个规则:

第三条重要的规则是关于内存占用的,这一点经常被忽略。您是在执行IO操作(如查询数据库、web服务),还是在执行CPU密集型操作(如计算数字和执行内存计算)?

当我们缓存结果时,应用程序的内存占用将会增加,因此选择适当的数据结构并只缓存需要缓存的数据属性是至关重要的。

有时我们查询多个表来创建一个类的对象。但是,我们只需要在应用程序中缓存基本属性。

缓存影响内存占用

作为一个实例,考虑我们构建了一个报告指示板,它查询数据库并检索订单列表。为了便于说明,让我们考虑一下仪表板上只显示订单名。

因此,我们可以只缓存每个订单的名称,而不是缓存整个订单对象。通常,架构师建议创建一个具有__slots__属性的精益数据传输对象(DTO),以减少内存占用。也使用了命名元组或Python数据类。

这就引出了本文的最后一节,概述了如何实现缓存的细节。

如何实现缓存?

有多种实现缓存的方法。

我们可以在Python进程中创建本地数据结构来构建缓存,或者将缓存作为服务器,充当代理并为请求提供服务。

有一些内置的Python工具,比如使用functools库中的cached_property装饰器。我想通过提供缓存装饰器属性的概述来介绍缓存的实现。

下面的代码片段说明了缓存属性是如何工作的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from functools import cached_property
class 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在LinuxWindows中非常流行,因为:

  • 它可以用于实现具有状态的记忆缓存。
  • 它甚至可以跨服务器分布。
  • 它使用起来非常简单,速度很快,并且在多个大型组织中广泛使用。
  • 它支持自动过期缓存的数据

我们需要安装一个叫做pymemcache的python库。

Memcache要求数据以字符串或二进制形式存储。因此,我们必须序列化缓存的对象,并在需要检索它们时反序列化它们。

代码片段展示了如何启动和使用memcache:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client = Client(host, serialiser, deserialiser)
client.set(‘blog’: {‘name’:’caching’, ‘publication’:’fintechexplained’}}
blog = client.get(‘blog’)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python学会 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python中的函数增强神器functools模块
functools是一个函数增强器,主要为高阶函数使用,作用于或者返回其他函数的函数,通常任何可调用的对象都可视为“函数”。主要包括以下几个函数:
星星在线
2020/05/22
1.3K0
后台开发必备:每个程序员都应掌握的缓存技术
缓存(Cache)是一种存储技术,可以存储数据,以便快速获取数据。缓存最重要的是两个特性:存储、快速获取。缓存的本质:「用空间换时间」,用快速存储的介质保存数据,以提升数据访问的速度。
腾讯云开发者
2024/07/02
9660
后台开发必备:每个程序员都应掌握的缓存技术
构建高性能Python Web应用【技术、优化和最佳实践】
Python作为一种强大的编程语言,在Web开发领域也有着广泛的应用。通过结合Python的灵活性和一些高性能的框架和工具,我们可以构建出高性能的Web应用程序。本文将介绍一些关键的技术和方法,帮助你在Python环境下构建高性能的Web应用程序。
一键难忘
2024/08/07
3400
让Python程序轻松加速的方法
最近,我读了一篇有趣的文章,文中介绍了一些未充分使用的Python特性的。在文章中,作者提到,从Python 3.2开始,标准库附带了一个内置的装饰器 functools.lru_cache 。我发现这个装饰器很令人兴奋,有了它,我们有可能轻松地为许多应用程序加速。
博文视点Broadview
2020/06/12
1.1K0
让Python程序轻松加速的方法
2k Star!cachetools:一款超好用的Python高效缓存管理工具
而Python的cachetools库提供了一个简单而强大的接口,用于实现各种缓存策略。
Python兴趣圈
2024/03/26
8840
2k Star!cachetools:一款超好用的Python高效缓存管理工具
Cachetools:提供各种内存缓存的Python库
在我们的开发生涯中,经常会遇到需要频繁访问某些计算昂贵的函数或方法的情况。每次重新计算不仅浪费时间,还会消耗大量资源。这时,一个高效的缓存机制就显得尤为重要。今天,我们就来聊聊Python生态中一个小众但极其实用的库:Cachetools。
luckpunk
2025/01/19
1150
Cachetools:提供各种内存缓存的Python库
译文:5个增强Node.js应用程序增强功能
原文链接:https://dev.to/chegerose/5-enhancements-that-will-boost-your-nodejs-app-3pj5
程序员法医
2022/12/20
1.8K0
译文:5个增强Node.js应用程序增强功能
使用redis进行缓存加速
为了提高应用程序的性能和用户体验,缓存加速成为了一种常见的优化手段。Redis作为一种高性能的内存数据库,被广泛应用于缓存加速方面。本文将介绍如何使用Redis进行缓存加速,包括原理、实现方法和应用场景。
GeekLiHua
2025/01/21
1250
开发中redis有什么用?
Redis(Remote Dictionary Server)是一个开源的内存数据库管理系统,它主要用于存储和检索数据。Redis支持各种数据结构,如字符串、列表、集合、有序集合、哈希表等,而且它可以在内存中高效地执行读写操作。Redis还提供持久性选项,以便将数据保存到磁盘上,以便在服务器重新启动时恢复数据。Redis通常用于缓存、会话存储、队列系统等应用,因为它的读写性能非常高。
希里安
2023/10/30
1840
开发中redis有什么用?
PHP中9大缓存技术总结
[导读] 1、全页面静态化缓存也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程。此种方式,在CMS系统中比较常见,比如dedecms;一种比较常用的实现方式是用输出缓存:Ob 1、全页面静态化缓存 也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程。此种方式,在CMS系统中比较常见,比如dedecms; 一种比较常用的实现方式是用输出缓存: Ob_start()******要运行的代码*******$co
wangxl
2018/03/08
1.6K0
PHP中9大缓存技术总结
Python专家编程系列: 4. 善用类装饰器(Python Class Decorators)
Python专家编程系列: 4. 善用类装饰器(Python Class Decorators)
AIFEx
2023/10/04
2930
Python专家编程系列: 4. 善用类装饰器(Python Class Decorators)
再聊缓存技术
对于现在的各种系统来说,缓存的应用无处不在。如果能合理的利用缓存,整个系统的性能将会得到大大的提高,Web开发尤其如此。一般高并发大访问量的应用,主要压力都在服务器端,所以服务器端的性能至关重要,缓存的使用,很多时候是有决定性影响的。
后端技术探索
2018/08/10
6630
PHP中的数据库二、memcache
枕边书
2018/01/04
1.1K0
9个Python 内置装饰器: 显著优化代码
装饰器是应用“Python 之禅”哲学的最佳 Python 特性。装饰器可以帮助您编写更少、更简单的代码来实现复杂的逻辑并在任何地方重用它。
数据科学工厂
2023/01/19
1.1K0
漫谈Web缓存架构
目前,Web应用的核心数据通常存放在数据库中,比如说用户信息、订单信息、交易信息等,同时,数据库和编程语言是无关的,通过SQL交互,Java、Php等语言写的程序需要访问数据库,执行业务逻辑,展示结果给用户。但是数据库有一定的局限性,譬如:1.数据库连接是非常 "昂贵 "的资源,为了复用这些资源,目前采用连接池技术,2. 连接池的连接数是有限的,如果用户过多,势必要等待,3. 读写数据时需要加锁。
木可大大
2018/04/28
1.1K0
漫谈Web缓存架构
Python项目使用memcached缓
许多Web应用都将数据保存到MySQL这样的关系型数据库管理系统中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现数据库的负担加重、数据库响应恶化、 网站显示延迟等不良影响。分布式缓存是优化网站性能的重要手段,大量站点都通过可伸缩的服务器集群提供大规模热点数据缓存服务。通过缓存数据库查询结果,减少数据库访问次数,可以显著提高动态Web应用的速度和可扩展性。业界常用的有redis、memcached等,今天要讲的就是在python项目中如何使用memcached缓存服务。
py3study
2020/01/07
9640
django 1.8 官方文档翻译: 2-6-4 数据库访问优化
Django的数据库层提供了很多方法来帮助开发者充分的利用他们的数据库。这篇文档收集了相关文档的一些链接,添加了大量提示,并且按照优化数据库使用的步骤的概要来组织。
ApacheCN_飞龙
2022/11/27
1.1K0
流畅的 Python 第二版(GPT 重译)(十二)
在 Python 中,数据属性和方法统称为属性。方法是可调用的属性。动态属性呈现与数据属性相同的接口——即,obj.attr——但是根据需要计算。这遵循 Bertrand Meyer 的统一访问原则:
ApacheCN_飞龙
2024/03/21
1370
流畅的 Python 第二版(GPT 重译)(十二)
独家 | 9个可以显著优化代码的Python内置装饰器
作者:Yang Zhou 翻译:陈之炎 校对:赵茹萱 本文约2000字,建议阅读8分钟本文介绍了精心挑选的9个函数装饰器,它将展示Python的优雅。 函数装饰器有事半功倍的力量。 Wallhaven 提供 图片 “简胜于繁。” Python函数装饰器是“Python zen”哲学的最佳特性。 装饰器助力用更少、更简单的代码来实现复杂的逻辑,并在其他地方实现重用。 有许多很棒的内置Python装饰器使编码变得更为容易,只使用一行代码便可向当前的函数或类中添加复杂的函数。 行胜于言,接下来,来看看精心挑选的
数据派THU
2023/03/29
5090
独家 | 9个可以显著优化代码的Python内置装饰器
理解分布式系统中的缓存架构(上)
CDN(Content Delivery Network 内容分发网络)的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求
lyb-geek
2018/08/16
1.3K0
理解分布式系统中的缓存架构(上)
相关推荐
python中的函数增强神器functools模块
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文