python OrderedDict实现有expire和max的队列和缓存服务

    周天又寂寞了….今天天气不是太好,有些阴冷,估计大街上的小妞肯定不会穿裙子…   估计不能拿着板凳去看美女的大腿了….  

     最近一直对服务端的开发很是感兴趣,python本身的数据结构是很容易实现队列或者是缓存的服务的。  我曾经实现一个python机遇lru算法的一个缓存服务。  别问我Lru缓存算法是啥, 可以理解为保持热数据和新数据的缓存的策略,算法会剔除不活跃的数据。 

http://xiaorui.cc/2014/11/01/python%E5%AE%9E%E7%8E%B0%E6%9C%80%E5%B0%91%E4%BD%BF%E7%94%A8%E7%AE%97%E6%B3%95lru%E5%8C%85%E6%8B%ACdict%E5%92%8Clist%E9%98%9F%E5%88%97/


正好这两天在家看redis的设计与实现,想到了redis的expire的功能, 他的expire是分两种,一个是间隔性质的去剔除过期的数据,还有一种是被动的剔除。  如果python的lru的数据源是在redis里面的话,很容易实现含有expire的lru。 lru和expire在缓存的策略是可以单独存在,又可以互相依赖的。 lru是用来保证存储的数据是活跃的,热的。 含有expire的缓存,是保证数据是新的,就算你的数据再热,但是他时间长了,就应该剔除他。   那么lru和expire如果一起用的话,不仅能实现热数据的存在,而且能实现数据过期。  


python实现expire max的原文链接 

http://xiaorui.cc

http://xiaorui.cc/?p=1289

这次就不用redis做数据源了,而是采用python的orderDict来实现。 orderDict是可以让字典有序的模块,orderDict自己会维持一个列表,通过这个列表来实现kv的有序。  我们主要是为了实现队列和缓存,首先先用orderDict实现一个简单的、类似FIFO先进先出的队列服务,附带了最大数据的控制。 我们会发现利用orderDict实现队列也是很容易的。 


那咱们再度深入下,基于上面的例子,我们该如何实现expire这个含有TTL功能,应该是如何的实现呢..   有人已经在githun里面分享了代码.

https://github.com/mailgun/expiringdict/blob/master/expiringdict/__init__.py  


这样expire和max的功能都有了,到现在为止,这个模块还只是实现了redis主键消逝的被动模式,如果是想用主动模式的话,是需要在模块里面开一个线程,一直去loop了。  个人觉得没必要设计一套可以主动剔除失效key的逻辑。   一个简单的服务,你还要开一个线程搞探测实在是折腾,如果非要用主动探测的话,我觉得可以set 和 get的时候,取模计算后顺手再去探测。   






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

2 Responses

  1. 你好 2015年4月23日 / 上午10:27

    while len(self) >= self.limit: 第一段代码,没转义

发表评论

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

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">