Python 技巧:使用lru_cache装饰器实现全局缓存

lru_cache装饰器

lru_cache是Python标准库中的一个装饰器,可以用于缓存函数的结果,有几个比较有意思的特性:

  • lru_cache会将函数的参数和返回值存储在一个字典中,以便在下次调用时可以直接返回结果,而不必重新计算。
  • lru_cache有两个可选参数:maxsizetypedmaxsize指定缓存的大小,而typed指定是否对不同类型的参数使用不同的缓存。
  • lru_cache使用LRU(最近最少使用)算法来管理缓存。当缓存达到最大大小时,它会删除最近最少使用的条目。
  • lru_cache只能用于不可变参数的函数。如果函数有可变参数,则不适用。

举个例子

下面的例子中,假设db_query是一个比较耗时的数据库操作,而且希望加载以后,就从缓存中读取,不要频繁的访问数据库,可以给函数db_query加上一个lru_cache的装饰器,这样,在第一次读取以后,key和值就被缓存了,下次再访问的时候,就会从缓存中读取。
在下面的例子中,限制了缓存的最大数量是3,当缓存第4个元素的时候,就会把其中的一个元素移除,下次再访问被移除的元素时,就会再次调用真正的查询操作。

from functools import lru_cache

@lru_cache(maxsize=3)
def db_query(key: str)->str:
	#假如这是个数据库查询的函数,比较耗时,我们希望加载一次以后就从缓存中读取
    print(f'execute db_query {key}')
    return f"this is {key}'s value"
if __name__ == '__main__':
    print(db_query("k1"))
    print(db_query("k1"))
    print(db_query("k2"))
    print(db_query("k3"))
    print(db_query("k4"))
    print(db_query("k1"))
execute db_query k1
this is k1's value
this is k1's value
execute db_query k2
this is k2's value
execute db_query k3
this is k3's value
execute db_query k4
this is k4's value
execute db_query k1
this is k1's value

注意

虽然这种方式使用起来很方便,但是还是要注意它的局限性,对于缓存后有变化的情况,就不太适合采用这种方式,因为变化的值无法更新到缓存中,所以这个装饰器仅适合于类似于配置信息或者这其他在启动后只加载一次的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原子星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值