代码之家  ›  专栏  ›  技术社区  ›  systempuntoout

自制微型memcache

  •  5
  • systempuntoout  · 技术社区  · 14 年前

    webpy )我想知道如何实现 memcache Gae上提供的功能。

    我天真地实现了这样的事情:

    class TinyCache():
        class _Container():
            def __init__(self, value, seconds):
                self.value = value
                self.cache_age = datetime.now()
                self.cache_time = timedelta(seconds = seconds)
            def is_stale(self):
                return self.cache_age + self.cache_time < datetime.now() 
    
        def __init__(self):
            self.dict_cache={}
    
        def add(self, key, value, seconds = 7200):
            self.dict_cache[key] = self._Container(value, seconds)
    
        def get(self, key):
            if key in self.dict_cache:
                if self.dict_cache[key].is_stale():
                    del self.dict_cache[key]
                    return None
                else:
                    return self.dict_cache[key].value
            else:
                return None
    

    data = tinycache.get("remote_api_data")
    if data is not None:
        return data
    else:
        data = self.api_call()
        tinycache.add("remote_api_data", data, 7200)
        return data
    

    我该怎么改进呢?
    我需要使它线程安全吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Manuel Salvadores    14 年前

    在我看来,您的缓存可能增长效率低下,因为它将保留很少使用的条目。因为,缓存中的条目似乎不会被删除,除非 get 请求对特定密钥执行操作。

    如果您想改进缓存,我将添加以下两个简单功能:

    1. 当请求一个项目时,我将重新启动 seconds
    2. 我将在一个单独的线程中实现一种机制来遍历缓存并删除太旧的条目。

    你也可以从中得到一些想法 Fixed size cache

    我刚找到这个食谱,超酷的。基本上你可以用函数装饰器包装你想要缓存的逻辑。类似于:

    @lru_cache(maxsize=20)
    def my_expensive_function(x, y):
        # my expensive logic here
        return result
    

    这些 LRU and LFU cache decorator Cache_algorithms 供参考)

        2
  •  0
  •   Felix Schwarz    14 年前

    在我的应用程序中,我只是使用这个缓存来存储每X小时从远程api检索到的一堆数据;换句话说,我不太强调这个缓存。

    我该怎么改进呢?

    然而,正如你明确要求的评论,我试图添加我的想法无论如何。在我看来,您可以使用传统的存储方式(如文件或数据库)来存储数据,因为它只会定期刷新。在许多情况下,一个人只需要一些(潜在的昂贵的)预处理,所以你可以集中精力只做一次工作,并且只以一种形式存储数据,这样就可以快速地访问/传递到客户机。

    • 简单的
    • 多个进程没有问题(例如FastCGI)
    • 减少记忆足迹

    我需要使它线程安全吗?