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

     最近一直对服务端的开发很是感兴趣,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的时候,取模计算后顺手再去探测。   







对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!
暂无相关产品

2则回应给“python OrderedDict实现有expire和max的队列和缓存服务”

  1. 你好说道:

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

发表评论