Python缓存神奇库cacheout全解,优于内存的性能

image

python的缓存库(cacheout)

项目: https://github.com/dgilland/cacheout

文档地址: https://cacheout.readthedocs.io

PyPI(下载链接): https://pypi.python.org/pypi/cacheout/

TravisCI(下载链接): https://travis-ci.org/dgilland/cacheout

特性:

后端使用字典进行缓存

使用缓存管理轻松访问多个缓存对象

当使用模块级缓存对象,重构运行时的缓存设置

最大缓存大小限制

默认的缓存时间设置以及缓存项自定义存活时间

批量的设置、获取、删除操作

线程安全

多种缓存机制的实现:

FIFO(先进先出)

LIFO(后进先出)

LRU (最近最少使用机制)

MRU (最近最多使用机制)

LFU (最小频率使用机制)

RR (随机替换机制)

解释一下,避免产生混淆,我在使用时就产生的歧义,后来通过小demo证实的!

LRU是删除最近最少使用的,保留最近最多使用的。

线路图:

层级缓存(多层级缓存)

支持缓存事件监听

获取缓存对象时的常规表示方法

获取缓存对象不存在时的回调处理支持

统计缓存

版本要求:

Python >= 3.4

安装:

pip install cacheout

通过创建一个缓存对象来开始了解:

# from cacheout import Cache# 如果选择LFUCache 就导入即可
from cacheout import LFUCache
cache = LFUCache()

默认的缓存的大小为256,默认存活时间是关闭的,这些属性可以如下设置:

cache = Cache(maxsize=256, ttl=0, timer=time.time, default=None) 

设置一个缓存可以通过cache.set():

cache.set(1, 'foobar')

获取缓存键的值通过:cache.get():

ret = cache.get(1)
 # 'foobar'

可以为每个键值对设置存活过期时间:

cache.set(3, {'data': {}}, ttl=1)
assert cache.get(3) == {'data': {}}
time.sleep(1)
assert cache.get(3) is None

为缓存函数提供了键值对的存活时间:

@cache.memoize()
def func(a, b):   
    pass

函数解除缓存:

@cache.memoize()
def func(a, b):   
   pass

func.uncached(1, 2)

复制机制:

assert cache.copy() == {1: 'foobar', 2: ('foo', 'bar', 'baz')}

删除缓存中的一个键值对

cache.delete(1)
assert cache.get(1) is None

清除整个缓存:

cache.clear()
assert len(cache) == 0

为get、set、delete设置了批量方法:

# 设置
cache.set_many({'a': 1, 'b': 2, 'c': 3})
# 获取
assert cache.get_many(['a', 'b', 'c']) 
# 删除cache.delete_many(['a', 'b', 'c'])
assert cache.count()

重置已经初始化的缓存对象

cache.configure(maxsize=1000, ttl=5 * 60)

通过cache.keys(), cache.values(), and cache.items()获取所有的键、值、以及键值对:

cache.set_many({'a': 1, 'b': 2, 'c': 3})
assert list(cache.keys()) == ['a', 'b', 'c']
assert list(cache.values()) == [1, 2, 3]
assert list(cache.items()) == [('a', 1), ('b', 2), ('c', 3)]

迭代整个缓存的键:

for key in cache:
    print(key, cache.get(key))
    # 'a' 1
    # 'b' 2
    # 'c' 3

检测键是否还存在于缓存中通过cache.has() and key in cache方法:

assert cache.has('a')
assert 'a' in cache

通过使用CacheManager来管理多个缓存对象:

from cacheout import CacheManager, LFUCache

# 设置多个缓存, 并设置缓存机制
cacheman = CacheManager({'a': {'maxsize': 100},
                         'b': {'maxsize': 200, 'ttl': 900},
                         'c':{} },
                        cache_class= LFUCache
                        )

cacheman['a'].set('key1', 'value1')
value = cacheman['a'].get('key')

cacheman['b'].set('key2', 'value2')
assert cacheman['b'].maxsize == 200
assert cacheman['b'].ttl == 900

cacheman['c'].set('key3', 'value3')

cacheman.clear_all()
for name, cache in cacheman:
    assert name in cacheman
    assert len(cache) == 0

总结:
1、建立在内存上,其处理速度由于redis,等同于内存
2、可以设置过期时间,以及缓存容量大小,控制占用内存的大小
3、可以选择适合自己的机制,进一步优化优先策略,优于内存

Python小学僧

Git代码: 公众号后台回复 python_sanic

下期预告:我是怎么从30个并发每个2000毫秒 到 300个并发每个178毫秒的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容

  • python的缓存库(cacheout) 链接: 项目:https://github.com/dgilland/c...
    星丶雲阅读 13,175评论 3 2
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,805评论 2 89
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,042评论 1 32
  • 写作是来至于心底最深处的呐喊。 每次写作的时候,在脑袋的上方,有无数一条条红色的带子。好像有风吹过一样,他们不断的...
    晚点两小时阅读 292评论 1 2
  • 一打眼九月悄无声息的来了,秋姑娘的脚步更近了。想想还没有着落的论文,内心就无比焦虑。原本想着等孩子睡着我看看文...
    爱文字的心理人阅读 210评论 0 1