广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python中自带缓存lru_cache怎么用
  • 331
分享到

python中自带缓存lru_cache怎么用

2023-06-20 21:06:42 331人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章给大家分享的是有关python中自带缓存lru_cache怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. lru_cache的使用1.1 参数详解以下是lru_cache方法的实现,我们看出可供

这篇文章给大家分享的是有关python中自带缓存lru_cache怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1. lru_cache的使用

1.1 参数详解

以下是lru_cache方法的实现,我们看出可供我们传入的参数有2个maxsize和typed,如果不传则maxsize的默认值为128,typed的默认值为False。其中maxsize参数表示是的被装饰的方法最大可缓存结果数量, 如果是默认值128则表示被装饰方法最多可缓存128个返回结果,如果maxsize传入为None则表示可以缓存无限个结果,你可能会疑惑被装饰方法的n个结果是怎么来的,打个比方被装饰的方法为def add(a, b):当函数被lru_cache装饰时,我们调用add(1, 2)和add(3, 4)将会缓存不同的结果。如果 typed 设置为true,不同类型的函数参数将被分别缓存。例如, f(3) 和 f(3.0) 将被视为不同而分别缓存。

def lru_cache(maxsize=128, typed=False):    if isinstance(maxsize, int):        if maxsize < 0:            maxsize = 0    elif maxsize is not None:        raise TypeError('Expected maxsize to be an integer or None')    def decorating_function(user_function):        wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo)        return update_wrapper(wrapper, user_function)    return decorating_function

1.2 基本用法

在我们编写接口时可能需要缓存一些变动不大的数据如配置信息,我们可能编写如下接口:

@api.route("/user/info", methods=["GET"])@functools.lru_cache()@login_requiredef get_userinfo_list():    userinfos = UserInfo.query.all()    userinfo_list = [user.to_dict() for user in userinfos]    return JSONify(userinfo_list)

我们缓存了从数据库查询的用户信息,下次再调用这个接口时将直接返回用户信息列表而不需要重新执行一遍数据库查询逻辑,可以有效较少IO次数,加快接口反应速度。

1.3 进阶用法

还是以上面的例子,如果发生用户的删除或者新增时,我们再请求用户接口时仍然返回的是缓存中的数据,这样返回的信息就和我们数据库中的数据就会存在差异,所以当发生用户新增或者删除时,我们需要清除原先的缓存,然后再请求用户接口时可以重新加载缓存。

@api.route("/user/info", methods=["POST"])@functools.lru_cache()@login_requiredef add_user():    user = UserInfo(name="李四")    db.session.add(user)    db.session.commit()        # 清除get_userinfo_list中的缓存    get_userinfo_list = current_app.view_functions["api.get_Machine_list"]    cache_info = get_userinfo_list.cache_info()    # cache_info 具名元组,包含命中次数 hits,未命中次数 misses ,最大缓存数量 maxsize 和 当前缓存大小 currsize    # 如果缓存数量大于0则清除缓存    if cache_info[3] > 0:     get_userinfo_list.cache_clear()    return jsonify("新增用户成功")

在上面这个用法中我们,如果我们把lru_cache装饰器和login_require装饰器调换位置时,上述的写法将会报错,这是因为login_require装饰器中用了functiontools.wrap模块进行装饰导致的,具原因我们在下节解释, 如果想不报错得修改成如下写法。

@api.route("/user/info", methods=["POST"])@login_require@functools.lru_cache()def add_user():    user = UserInfo(name="李四")    db.session.add(user)    db.session.commit()        # 清除get_userinfo_list中的缓存    get_userinfo_list = current_app.view_functions["api.get_machine_list"]    cache_info = get_userinfo_list.__wrapped__.cache_info()    # cache_info 具名元组,包含命中次数 hits,未命中次数 misses ,最大缓存数量 maxsize 和 当前缓存大小 currsize    # 如果缓存数量大于0则清除缓存    if cache_info[3] > 0:     get_userinfo_list.__wrapped__.cache_clear()    return jsonify("新增用户成功")

2. functiontools.wrap装饰器对lru_cache的影响

在上节我们看到,因为@login_require和@functools.lru_cache()装饰器的顺序不同, 就导致了程序是否报错, 其中主要涉及到两点:

  • login_require装饰器中是否用了@functiontools.wrap()装饰器

  • @login_require和@functools.lru_cache()装饰器的执行顺序问题

当我们了解完这两点后就可以理解上述写法了。

2.1 多个装饰器装饰同一函数时的执行顺序

这里从其他地方盗了一段代码来解释一下,如下:

def decorator_a(func):    print('Get in decorator_a')    def inner_a(*args,**kwargs):        print('Get in inner_a')        res = func(*args,**kwargs)        return res    return inner_adef decorator_b(func):    print('Get in decorator_b')    def inner_b(*args,**kwargs):        print('Get in inner_b')        res = func(*args,**kwargs)        return res    return inner_b@decorator_b@decorator_adef f(x):    print('Get in f')    return x * 2f(1)

输出结果如下:

'Get in decorator_a'
'Get in decorator_b'
'Get in inner_b'
'Get in inner_a'
'Get in f'

是不是很像Django中的中间件的执行顺序,其实原理都差不多。

2.2 functiontools.wrap原理

引用其他博主的描述:

Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring。

补充:为了访问原函数此函数会设置一个__wrapped__属性指向原函数, 这样就可以解释上面1.3节中我们的写法了。

2.3 使用wrap装饰器前后的变化

未完待续。。。。。。。。。

3. 自制简易的my_cache

3.1 lru_cache提供的功能

lru_cache缓存装饰器提供的功能有:

  • 缓存被装饰对象的结果(基础功能)

  • 获取缓存信息

  • 清除缓存内容

  • 根据参数变化缓存不同的结果

  • LRU算法当缓存数量大于设置的maxsize时清除最不常使用的缓存结果

从列出的功能可知,python自带的lru_cache缓存方法可以满足我们日常工作中大部分需求, 可是它不包含一个重要的特性就是,超时自动删除缓存结果,所以在我们自制的my_cache中我们将实现缓存的超时过期功能。

3.2 cache的核心部件

在作用域内存在一个相对全局的字典变量cache={}

在作用域内设置相对全局的变量包含命中次数 hits,未命中次数 misses ,最大缓存数量 maxsize和 当前缓存大小 currsize

第二点中的缓存信息中增加缓存加入时间和缓存有效时间

3.3 my_cache的实现

待实现。。。。。。。。。。。。

4. lru_cache缓存和redis缓存的区别

比较类型lru_cacheRedis
缓存类型缓存在app进程内存中缓存在redis管理的内存中
分布式只缓存在单个app进程中可做分布式缓存
数据类型hash 参数作为key,返回结果为value有5种类型的数据结构
适用场景比较小型的系统、单体应用常用的缓存解决方案
功能缓存功能但是缺少过期时间控制,但是使用上更加便捷具备缓存需要的各种要素

感谢各位的阅读!关于“python中自带缓存lru_cache怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: python中自带缓存lru_cache怎么用

本文链接: https://www.lsjlt.com/news/300003.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python中自带缓存lru_cache怎么用
    这篇文章给大家分享的是有关python中自带缓存lru_cache怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. lru_cache的使用1.1 参数详解以下是lru_cache方法的实现,我们看出可供...
    99+
    2023-06-20
  • python自带缓存lru_cache用法及扩展的使用
    目录1. lru_cache的使用1.1 参数详解1.2 基本用法1.3 进阶用法2. functiontools.wrap装饰器对lru_cache的影响2.1 多个装饰器装饰同一函数时的执行顺序2.2 funct...
    99+
    2022-06-03
    python自带缓存lru_cache python lru_cache
  • Python中缓存lru_cache的方法是什么
    这篇文章主要讲解了“Python中缓存lru_cache的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中缓存lru_cache的方法是什么”吧!一、前言我们经常谈论的...
    99+
    2023-06-29
  • python如何利用自带的缓存机制提高效率
    这篇文章将为大家详细讲解有关python如何利用自带的缓存机制提高效率,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。利用自带的缓存机制提高效率缓存是一种将定量数据加以保存,以备迎合后续获取需求的处理方式,...
    99+
    2023-06-27
  • Java中TimedCache带时间缓存工具类怎么用
    这篇文章主要为大家展示了“Java中TimedCache带时间缓存工具类怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中TimedCache带时间缓存工具类怎么用”这篇文章吧。简述...
    99+
    2023-06-25
  • Python怎么使用LRU缓存策略进行缓存
    本文小编为大家详细介绍“Python怎么使用LRU缓存策略进行缓存”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python怎么使用LRU缓存策略进行缓存”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、Pyt...
    99+
    2023-07-06
  • python自带help功能怎么使用
    这篇“python自带help功能怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python自带help功能怎么使用...
    99+
    2023-07-05
  • AngularJS中缓存怎么用
    这篇文章主要介绍了AngularJS中缓存怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。缓存篇一个缓存就是一个组件,它可以透明地储存数...
    99+
    2022-10-19
  • ASP.NET中怎么构建自定义文件缓存
    本篇内容介绍了“ASP.NET中怎么构建自定义文件缓存”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ASP.NET的输出缓存(即静态HTML...
    99+
    2023-06-17
  • C#中缓存System.Web.Caching怎么用
    今天小编给大家分享一下C#中缓存System.Web.Caching怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Sy...
    99+
    2023-06-30
  • spring缓存自定义resolver的方法怎么用
    本篇内容介绍了“spring缓存自定义resolver的方法怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、概述cache-asid...
    99+
    2023-06-29
  • Java 中怎么自定义一个LRU 缓存算法
    今天就跟大家聊聊有关Java 中怎么自定义一个LRU 缓存算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。背景LinkedHashMap继承自HashMap,内部提供了一个remo...
    99+
    2023-06-17
  • JDK自带JVM内存检测工具jconsole怎么使用
    要使用jconsole来监视JVM内存,您可以按照以下步骤操作: 打开终端或命令提示符,并导航到JDK的`bin`目录(例如,`...
    99+
    2023-10-24
    JDK JVM jconsole
  • Java自动装箱、自动拆箱与Integer缓存怎么使用
    今天小编给大家分享一下Java自动装箱、自动拆箱与Integer缓存怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1...
    99+
    2023-06-30
  • Golang中的缓存库freecache怎么用
    这篇文章主要讲解了“Golang中的缓存库freecache怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang中的缓存库freecache怎么用”吧!go开发缓存场景一般使用m...
    99+
    2023-06-29
  • Python中怎么使用装饰器实现函数的缓存
    这篇文章主要介绍“Python中怎么使用装饰器实现函数的缓存”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中怎么使用装饰器实现函数的缓存”文章能帮助大家解决问题。装饰器模式在以下场景中被...
    99+
    2023-07-05
  • jQuery中数据缓存$.data怎么使用
    这篇文章主要介绍“jQuery中数据缓存$.data怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“jQuery中数据缓存$.data怎么使用”文章能帮助大家解决问题。一、实现原理:对于DOM...
    99+
    2023-07-04
  • Vue3中怎么用WeakMap作为缓存区
    这篇文章主要介绍“Vue3中怎么用WeakMap作为缓存区”,在日常操作中,相信很多人在Vue3中怎么用WeakMap作为缓存区问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3中怎么用WeakMap作为...
    99+
    2023-06-22
  • odoo中怎么使用redis实现缓存
    本篇内容主要讲解“odoo中怎么使用redis实现缓存”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“odoo中怎么使用redis实现缓存”吧!Odoo中使用Redis实现缓存可以提高系统性能,避...
    99+
    2023-07-05
  • SpringBoot项目中怎么使用缓存Cache
    本文小编为大家详细介绍“SpringBoot项目中怎么使用缓存Cache”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot项目中怎么使用缓存Cache”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作