简单的memory cache。可以用来内存缓存任意函数方法。

#!/usr/bin/python

import functools
from threading import RLock
import logging LOGGER = logging.getLogger(__name__) class CacheNullValue(object):
pass _Null = CacheNullValue() class Cache(object): def __init__(self, cache_limit=1000):
self._cache = {}
self._queue = []
self.cache_limit = cache_limit
self._lock = RLock() def __getitem__(self, name):
with self._lock:
return self._cache.get(name, _Null)
get = __getitem__ def __setitem__(self, name, value):
with self._lock:
if len(self._queue) >= self.cache_limit:
del self._cache[self._queue.pop(0)]
self._queue.append(name)
self._cache[name] = value
set = __setitem__ def cache(cache_limit):
"""A function decorator for method cache store
""" def cached(f):
@functools.wraps(f)
def _cached(*args, **kwargs):
cid = repr((args, kwargs))
data = _cached.cache.get(cid)
if data != _Null:
LOGGER.debug('hit cached `' + _cached.__name__ + '` for ' + cid)
return data
data = _cached.f(*args, **kwargs)
_cached.cache.set(cid, data)
return data _cached.f = f
_cached.cache = Cache(cache_limit) return _cached return cached def setup(cache_limit):
""" A global thread safe key-value store
"""
global _cache_object
_cache_object = Cache(cache_limit) def set(cid, data): _cache_object.set(cid, data) def get(cid):
return _cache_object.get(cid) if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)-8s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S', filemode='a+') class T(object): @cache(100)
def c(self, t):
return t @cache(100)
def cc(t):
return t t = T()
print t.c('hello')
print t.c('hello')
print t.c('h')
print t.c('hello')
print cc('he')
print cc('he')

最新文章

  1. 用 pytube 爬取 youtube 视频
  2. js限制文本框只可以输入数字
  3. [Angular 2] Create template with Params
  4. cc2640-各DEMO板性能分析
  5. WIN32不得不会:视频播放器
  6. MySQL基本查询语句
  7. js实现简单计算器
  8. SUBTOTAL 函数与所在行
  9. ajax get/post
  10. nodejs iconfont处理
  11. powerdesigener 12.5注册机
  12. Linux 驱动——LED(驱动分离分层)
  13. centos 7 中安装 mysql 5.7
  14. Flask框架整理
  15. Lua脚本语法说明(转)
  16. Delphi的程序单元、结构、基础知识(转)
  17. grpc protobuf
  18. 【转】SyntaxError: Non-ASCII character ‘\xe5′ in file
  19. iOS边练边学--transform的简单介绍并且用transform实现键盘处理
  20. JFinal的启动源码解读

热门文章

  1. 二分搜索 Codeforces Round #299 (Div. 2) C. Tavas and Karafs
  2. sql基础语法-联接查询
  3. html img标签显示一个默认图片
  4. 137 Single Number II 数组中除了一个数外,其他的数都出现了三次,找出这个只出现一次的数
  5. 134 Gas Station 加油站
  6. Apache Kylin的核心概念
  7. sql server的一个字符串分割的表值函数方法
  8. 分布式数据存储 之 Redis(二) —— spring中的缓存抽象
  9. 字符串、数组、json
  10. 【js数据结构】图的深度优先搜索与广度优先搜索