美文网首页程序员的星期天
聊一聊Python ExpiringDict

聊一聊Python ExpiringDict

作者: 逆小苍 | 来源:发表于2020-08-15 11:41 被阅读0次

缘起

最近工作中,涉及到接口优化,无奈时间紧,要优化的地方很多,无法每个接口都详尽梳理其业务逻辑;由于业务场景对数据的实时性要求不高,且无个性化参数,即每个用户请求返回结果都一样;如此,就可以想办法短时间内缓存逻辑处理的结果,这样接下来的时间内,后续的请求就很快得到响应;若想实现缓存,自然想到redis,如果数据量很大,redis确实不错,无非是多了一次交互,相对于之前的每次都要复杂逻辑处理,确实快了很多;但如果数据量比较少,是否可以把结果放到内存里呢,设置一个过期时间;这样就少了一次redis的交互,时间更短;于是查阅资料,发现了一个三方库 expiringdict

始惊

expiringdict实现了一个有序字典类,支持设置过期时间max_age_seconds,以及字典大小max_len;适用于缓存目的的自动过期值字典;支持python 2python 3,其源码仅仅250行,通俗易懂,值得一看;

安装方式
  • 命令行安装:
pip install expiringdict
  • 源码安装:
git clone https://github.com/mailgun/expiringdict.git
cd expiringdict
python setup.py install
  • 简单使用:
>> from expiringdict import ExpiringDict
>> test_dict =ExpiringDict(max_len=10, max_age_seconds=100)
>> test_dict[1]="a"; test_dict[2]="b"; test_dict[3]="c"
>> test_dict
Out: ExpiringDict([(1, 'a'), (2, 'b'), (3, 'c')])

>>  test_dict.ttl(1)
Out: 41.763437032699585

>> test_dict.items_with_timestamp()
Out:  [(1, ('a', 1597461000.321023)),
       (2, ('b', 1597461000.321065)),
       (3, ('c', 1597461000.321101))]

次醉

ExpiringDict该类继承了OrderedDict,数据的存储为:key : (value, timestamp) 其过期机制的实现,属于消极过期机制,即当一个key到期后,该类并不会主动清理掉,而是等到下一次这个key被访问到的时候,检查其过期与否,如果其过期,就清理掉。

常用方法

pop(self, key, default=None)
获取指定key对应的value,并将其从字段中移除

ttl(self, key)
返回指定key剩余过期时间,单位s,如果key过期或不存在,返回 None

get(self, key, default=None, with_age=False)
返回key对应的value, key不存在返回默认值,with_age为true时返回一个元组,第一个值为value,第二个值为该key已经存在的时间

items_with_timestamp(self)
返回字典(key, value, timestamp)三元组列表的副本

终迷

了解其用法后,只需在handler类中初始化一个过期字典,缓存接口返回结果即可

...
from expiringdict import ExpiringDict

@route("/api/test/info")
class InfoHandler(RequestHandler):
    cache = ExpiringDict(max_len=10, max_age_seconds=60)

    def get(self):
        if 'info' in self.cache:
            return self.cache['info']
        result = self.get_info_result() # 原有获取result逻辑
        self.cache['info'] = result
        return result

如此,就可以在不修改大量代码的情况下,短时间内迅速提高接口性能

相关文章

  • 聊一聊Python ExpiringDict

    缘起 最近工作中,涉及到接口优化,无奈时间紧,要优化的地方很多,无法每个接口都详尽梳理其业务逻辑;由于业务场景对数...

  • 聊一聊

    就是这样,喜欢自我欺骗,明知道,真心想你,或者有事的人,会打电话给你。却还是忍不住的用微信,看一个人的消息和动态,...

  • 聊一聊

    记录一下,现在是女儿的生日。2020.7.25星期六 生日快乐我的小天使 微淼商学院说过最经典的话是:有些做商学院...

  • 聊一聊

    早在三天前师兄就告知我们今天上午老师会和我们在实验室聊一聊。校园卡余额不足,时间紧张未吃早餐,早上慌忙收拾赶紧到实...

  • 聊一聊

    大家好,我是野生梅花鹿。 马上就12点了,我决定用几分钟的时间随便写点啥~ 首先呢,是反省。 这个月,其实懒惰了很...

  • 聊一聊

    很久没写了,聊聊最近发生的事,十月份开始了一段长板之旅,一开始担心害怕摔,因为通过挑战一个个动作,挺有趣的,当你为...

  • 聊一聊

    疫情这些年,常常听到的是,哪哪被封控了之类,作为天选打工人,一直在正常上班搬砖中。 直至上周五晚接...

  • 产品经理的 Python 自学之路(二)

    接上一篇产品经理的 Python 自学之路(一),聊一聊掌握 Python 基石概念后,为什么自己写代码还是那么难...

  • 为什么Swift和Python要抛弃++\--?

    今天来聊一聊,为什么Swift和Python要抛弃++--? 原文| 地址 [https://www.cnblog...

  • Python从放弃到入门:公众号历史文章爬取为例谈快速学习技能

    这篇文章不谈江流所专研的营销与运营,而聊一聊技能学习之路,聊一聊Python这门最简单的编程语言该如何学习,我完成...

网友评论

    本文标题:聊一聊Python ExpiringDict

    本文链接:https://www.haomeiwen.com/subject/vxtadktx.html