支持key过期失效和限制字典大小的开源项目 [python expire max length]

起因:

     最近在写业务数据监控,既然是监控,那肯定是有不同时间区间的监控动作,放在linux下的crontab有些不合适了,因为有不同的函数要触犯,我不能为这堆函数定制一堆main()吧。用一些开源的计划任务工具,不是很让人满意。 在社区找了一些不靠谱的模块,我是个纠结的人,特别喜欢看别人的实现,然后来喷 ! O(∩_∩)O~)   结果,正如我一开始想到的结果,他们的实现还真是很有些蛋疼,用某人的话来说,特sb的实现。居然有好几个是你有几个任务,就给你开几个线程,然后sleep,当然这些动作对于上层接口层是看不到。但是像我这种几百个任务要监控的,那该如何是好? apscheduler 不错,只是实现偏复杂一些,索性自己实现了。 

关于python dict过期失效的实现,原文地址 http://xiaorui.cc/?p=1913

那说了这么多废话,我为什么会需要一个可以过期的dict?  我实现的这个高性能计划任务管理系统,是用Crontab模块识别时间,比如匹配 */1 * * * * ,当小于1s的时候,我就会扔给MQ,但是我扫描我的任务的间隔也是0.1,也就是说,我很有可能会把这任务多次的提交给消费者。  这时候,我就需要一个中间层,可以过滤这些多余的任务,好避开扫描时间。


又tm废话扯远了…. ….

总之,我特别想实现像redis expire那样的功能,基于key级别实现,撇开性能不谈,expiredict这模块比较适合有过期过滤需求的,不用自己再费心的去判断时间。

简单说下,redis对于过期失效的内部实现,实际上,Redis 删除失效主键的方法主要有两种:
消极方法(passive way),在主键被访问时如果发现它已经失效,那么就删除它
积极方法(active way),周期性地从设置了失效时间的主键中选择一部分失效的主键删除

我现在用的方法是消极的方法,积极的方法我也想过,因为expiredict本身是一个嵌入的模块,没必要在开启一个线程来控制这些东西。

项目名

expiredict


介绍

python的一个小模块,支持key的过期失效及map个数的dict,涵盖所有常用的dict方法。

New Future 1. support len 2. support clear

To Do List

1. logging 终端打印

GITHUB:

https://github.com/rfyiamcool/expiredict

PYPI:

https://pypi.python.org/pypi/expiredict

下面是expiredict的使用方法,很简单构建一个类似dict的对象,就可以直接用了,比原生的dict多了过期时间及大小限制。

import time 

from expiredict import ExpireDict
d = ExpireDict(10)
d['a'] = 'abc'
print d.clear()
print "clear data :%s"%d.keys()
d['a'] = 'abc'
print "dict length :%s"%len(d)
print "d.keys() : %s"%d.keys()
d.set_ttl('a',2)
print d.ttl('a')
print "return value : %s"%d['a']
time.sleep(3)


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

3 Responses

  1. RED 2016年4月22日 / 下午2:23

    感谢分享,我也在自己实现一种类似于redis的支持过期的存储.

    redis对于过期失效的内部实现,实际上,Redis 删除失效主键的方法主要有两种:
    消极方法(passive way),在主键被访问时如果发现它已经失效,那么就删除它
    积极方法(active way),周期性地从设置了失效时间的主键中选择一部分失效的主键删除

    这两种方法一种要浪费空间,另外一个要满足精准则要频繁运算.
    我个人采用的是结合积极与消极结合,周期可以变大但可以防止内存占用过大,每次访问检测是否失效用于控制精准.

    • 峰云就她了 2016年4月24日 / 下午3:05

      我自己觉得其实没必要积极删除,换句话说没必要那么高级,我python单个进程驻了5G内存,没啥大问题,只是性能有些影响.

  2. 无敌 2015年8月28日 / 上午8:33

    自从订阅了你的rss后,经常大早上收到文章更新

发表评论

邮箱地址不会被公开。 必填项已用*标注