python的緩存庫(cacheout)
項(xiàng)目: https://github.com/dgilland/cacheout
文檔地址: https://cacheout.readthedocs.io
PyPI(下載鏈接): https://pypi.python.org/pypi/cacheout/
TravisCI(下載鏈接): https://travis-ci.org/dgilland/cacheout
特性:
后端使用字典進(jìn)行緩存
使用緩存管理輕松訪問多個(gè)緩存對(duì)象
當(dāng)使用模塊級(jí)緩存對(duì)象状知,重構(gòu)運(yùn)行時(shí)的緩存設(shè)置
最大緩存大小限制
默認(rèn)的緩存時(shí)間設(shè)置以及緩存項(xiàng)自定義存活時(shí)間
批量的設(shè)置套像、獲取璧亮、刪除操作
線程安全
多種緩存機(jī)制的實(shí)現(xiàn):
FIFO(先進(jìn)先出)
LIFO(后進(jìn)先出)
LRU (最近最少使用機(jī)制)
MRU (最近最多使用機(jī)制)
LFU (最小頻率使用機(jī)制)
RR (隨機(jī)替換機(jī)制)
解釋一下景馁,避免產(chǎn)生混淆板壮,我在使用時(shí)就產(chǎn)生的歧義,后來通過小demo證實(shí)的!
LRU是刪除最近最少使用的合住,保留最近最多使用的绰精。
線路圖:
層級(jí)緩存(多層級(jí)緩存)
支持緩存事件監(jiān)聽
獲取緩存對(duì)象時(shí)的常規(guī)表示方法
獲取緩存對(duì)象不存在時(shí)的回調(diào)處理支持
統(tǒng)計(jì)緩存
版本要求:
Python >= 3.4
安裝:
pip install cacheout
通過創(chuàng)建一個(gè)緩存對(duì)象來開始了解:
# from cacheout import Cache# 如果選擇LFUCache 就導(dǎo)入即可
from cacheout import LFUCache
cache = LFUCache()
默認(rèn)的緩存的大小為256,默認(rèn)存活時(shí)間是關(guān)閉的透葛,這些屬性可以如下設(shè)置:
cache = Cache(maxsize=256, ttl=0, timer=time.time, default=None)
設(shè)置一個(gè)緩存可以通過cache.set():
cache.set(1, 'foobar')
獲取緩存鍵的值通過:cache.get():
ret = cache.get(1)
# 'foobar'
可以為每個(gè)鍵值對(duì)設(shè)置存活過期時(shí)間:
cache.set(3, {'data': {}}, ttl=1)
assert cache.get(3) == {'data': {}}
time.sleep(1)
assert cache.get(3) is None
為緩存函數(shù)提供了鍵值對(duì)的存活時(shí)間:
@cache.memoize()
def func(a, b):
pass
函數(shù)解除緩存:
@cache.memoize()
def func(a, b):
pass
func.uncached(1, 2)
復(fù)制機(jī)制:
assert cache.copy() == {1: 'foobar', 2: ('foo', 'bar', 'baz')}
刪除緩存中的一個(gè)鍵值對(duì)
cache.delete(1)
assert cache.get(1) is None
清除整個(gè)緩存:
cache.clear()
assert len(cache) == 0
為get笨使、set、delete設(shè)置了批量方法:
# 設(shè)置
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()
重置已經(jīng)初始化的緩存對(duì)象
cache.configure(maxsize=1000, ttl=5 * 60)
通過cache.keys(), cache.values(), and cache.items()獲取所有的鍵僚害、值硫椰、以及鍵值對(duì):
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)]
迭代整個(gè)緩存的鍵:
for key in cache:
print(key, cache.get(key))
# 'a' 1
# 'b' 2
# 'c' 3
檢測(cè)鍵是否還存在于緩存中通過cache.has() and key in cache方法:
assert cache.has('a')
assert 'a' in cache
通過使用CacheManager來管理多個(gè)緩存對(duì)象:
from cacheout import CacheManager, LFUCache
# 設(shè)置多個(gè)緩存, 并設(shè)置緩存機(jī)制
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
總結(jié):
1萨蚕、建立在內(nèi)存上靶草,其處理速度由于redis,等同于內(nèi)存
2门岔、可以設(shè)置過期時(shí)間爱致,以及緩存容量大小,控制占用內(nèi)存的大小
3寒随、可以選擇適合自己的機(jī)制糠悯,進(jìn)一步優(yōu)化優(yōu)先策略帮坚,優(yōu)于內(nèi)存
Git代碼: 公眾號(hào)后臺(tái)回復(fù) python_sanic
下期預(yù)告:我是怎么從30個(gè)并發(fā)每個(gè)2000毫秒 到 300個(gè)并發(fā)每個(gè)178毫秒的