起因:
最近在写业务数据监控,既然是监控,那肯定是有不同时间区间的监控动作,放在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)
感谢分享,我也在自己实现一种类似于redis的支持过期的存储.
”
redis对于过期失效的内部实现,实际上,Redis 删除失效主键的方法主要有两种:
消极方法(passive way),在主键被访问时如果发现它已经失效,那么就删除它
积极方法(active way),周期性地从设置了失效时间的主键中选择一部分失效的主键删除
”
这两种方法一种要浪费空间,另外一个要满足精准则要频繁运算.
我个人采用的是结合积极与消极结合,周期可以变大但可以防止内存占用过大,每次访问检测是否失效用于控制精准.
我自己觉得其实没必要积极删除,换句话说没必要那么高级,我python单个进程驻了5G内存,没啥大问题,只是性能有些影响.
自从订阅了你的rss后,经常大早上收到文章更新