{ "info": { "author": "wayhome", "author_email": "y@zhihu.com", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 3" ], "description": "# Tache\nTache \u662f\u4e00\u4e2a Python \u7684\u7f13\u5b58\u6846\u67b6\u3002\nA tag based invalidation caching library\n\n* [Documention](http://zhihu.github.io/tache)\n* [\u9879\u76ee\u5730\u5740](https://github.com/zhihu/tache)\n\n\nContents\n---------\n* [Tag \u8be6\u7ec6\u7528\u6cd5](advance_tag.md)\n* [\u4f7f\u7528\u5173\u952e\u5b57\u53c2\u6570](use_kwargs.md)\n* [Cache \u7a7a\u503c\u4e0e\u7f13\u5b58\u7a7f\u900f](cache_null_and_miss.md)\n\n\n## Features\n\n* \u9ed8\u8ba4\u7f13\u5b58\u7a7a\u503c\uff0c\u9632\u6b62\u7a7f\u900f\n* \u57fa\u4e8etag \u6279\u91cf\u5931\u6548\u7f13\u5b58\n* batch \u6279\u91cf\u7f13\u5b58\n* \u652f\u6301 `YAML` `JSON` `PICKLE` \u591a\u79cd Backend Serializer\n\n## Getting Started\n\n* \u57fa\u672c\u7528\u6cd5\n\n```\nimport random\nimport fakeredis\nfrom tache import RedisCache\n\nredis_client = fakeredis.FakeStrictRedis()\ncache = RedisCache(conn=redis_client, format=\"JSON\")\n\n@cache.cached()\ndef add(a, b):\n return a + b + random.randint(1,100)\n\nresult1 = add(5, 6)\n# \u7f13\u5b58\u751f\u6548\u503c\u4e0d\u53d8\nassert add(5, 6) == result1\n# \u5931\u6548\u7f13\u5b58\nadd.invalidate(5, 6)\nassert add(5, 6) != result1\n```\n\n* \u57fa\u4e8e tag \u7684\u6279\u91cf\u7f13\u5b58\u5931\u6548\n\ntag \u53ef\u4ee5\u662f\u56fa\u5b9a\u4e5f\u53ef\u4ee5\u662f\u52a8\u6001\u7684\uff0c\u5176\u4e2d\u52a8\u6001\u53c2\u6570\u4ee3\u8868\u5728\u51fd\u6570\u4e2d\u7684\u53c2\u6570\u4f4d\u7f6e\u3002\n\u5931\u6548\u67d0\u4e2a tag \u65f6\uff0c\u4ee3\u8868\u8fd9\u4e2a\u51fd\u6570\u4e0b\u62e5\u6709\u76f8\u540c tag \u7684\u7f13\u5b58\u5168\u90e8\u5931\u6548\u3002\n\n```\n@cache.cached(tags=[\"a:{0}\"])\ndef add(a, b):\n return a + b + random.randint(1,100)\n\nresult1 = add(5, 6) \nresult2 = add(5, 7)\nadd.invalidate_tag(\"a:5\")\nassert result1 != add(5, 6) \nassert result2 != add(5, 7)\n```\n\n\n* refresh \u5237\u65b0\u7f13\u5b58\n\n\u5f53\u8c03\u7528refresh \u65f6\uff0c\u5c06\u4f1a\u91cd\u65b0\u5237\u65b0\u7f13\u5b58\u5e76\u8fd4\u56de\u6700\u65b0\u503c\u3002\n\n\n```\nclass A(object):\n\n def __init__(self):\n self.extra = 0\n\n @cache.cached()\n def add(self, a, b):\n self.extra += 1\n return a + b + self.extra\n\na = A()\nassert a.add(5, 6) == 12\nassert a.extra == 1\nassert a.add.refresh(5, 6) == 13\nassert a.extra == 2\n```\n\n* batch \u7f13\u5b58\u6a21\u5f0f\n\n```\n@cache.batch()\ndef get_comments(*comment_ids):\n return [get_comment(c) for c in comment_ids]\n\nget_comments(1,2,3,4,5) # no cache, \u8c03\u7528\u5b8c\u6bd5\u5168\u90e8\u7f13\u5b58\nget_comments(2,3,4,5,6) # 2,3,4,5 \u4ece\u7f13\u5b58\u4e2d\u53d6\uff0c6 \u5728\u8c03\u7528\u5b8c\u7f13\u5b58\nget_comments.invalidate(3,4,5) # \u5931\u6548 3,4,5 \u7684\u7f13\u5b58\n```\n\n## Notice\n\n* \u652f\u6301 `classmethod/staticmethod` \u63cf\u8ff0\u7b26, \u4f46\u5728\u4f7f\u7528 `classmethod` \u65f6\u76ee\u524d\u5fc5\u987b\u628a\n`classmethod` \u653e\u5728\u5185\u5c42\n\n\n```\nclass AC(object):\n\n @cache.cached()\n @classmethod\n def add(cls, a, b):\n return a + b + random.randint(1,100)\n```\n\n* \u8bbe\u7f6e namespace, \u5904\u7406\u5bf9\u8c61\u5c5e\u6027\u4fee\u6539\u7684\u95ee\u9898\n\nkey \u7684\u751f\u6210\u89c4\u5219\u9ed8\u8ba4\u4e3a `namespace:module.classname.func|arg1-arg2|tag1-tag2`\u3002\n\u5176\u4e2d `namespace` \u4e3a\u7a7a, `classname` \u4e0d\u5b58\u5728\u65f6\u4e5f\u4e3a\u7a7a\u3002\n\n```\nclass A(object):\n @cache.cache(namespace=\"v1\")\n def add(self, a, b):\n return db.execute(sql).fetchone()\n```\n\n\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u5982\u679c\u6570\u636e\u5e93\u5b57\u6bb5\u53d1\u751f\u66f4\u6539\uff0c\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539 namespace \u7684\u65b9\u5f0f\uff0c\u8ba9\u65b0\u8001\u4ee3\u7801\u4f7f\u7528\u4e0d\u540c\u7684\u7f13\u5b58\u7ed3\u679c\u3002\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/zhihu/tache", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "tache", "package_url": "https://pypi.org/project/tache/", "platform": "", "project_url": "https://pypi.org/project/tache/", "project_urls": { "Homepage": "https://github.com/zhihu/tache" }, "release_url": "https://pypi.org/project/tache/0.2.0/", "requires_dist": null, "requires_python": "", "summary": "A tag based invalidation caching library", "version": "0.2.0" }, "last_serial": 3430408, "releases": { "0.1.0": [], "0.2.0": [ { "comment_text": "", "digests": { "md5": "c0ed853430cb153397ae76ff7b9176ff", "sha256": "250a386e0cc01048638cb8e2aaab23764f4cf3e6cfadc9ff9cbb597b2ed8b075" }, "downloads": -1, "filename": "tache-0.2.0.tar.gz", "has_sig": false, "md5_digest": "c0ed853430cb153397ae76ff7b9176ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9412, "upload_time": "2017-12-20T06:09:20", "url": "https://files.pythonhosted.org/packages/21/c9/85388a27769d698cd71e81f945bbc09e5df09d8de29b67471015ecef9b49/tache-0.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c0ed853430cb153397ae76ff7b9176ff", "sha256": "250a386e0cc01048638cb8e2aaab23764f4cf3e6cfadc9ff9cbb597b2ed8b075" }, "downloads": -1, "filename": "tache-0.2.0.tar.gz", "has_sig": false, "md5_digest": "c0ed853430cb153397ae76ff7b9176ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9412, "upload_time": "2017-12-20T06:09:20", "url": "https://files.pythonhosted.org/packages/21/c9/85388a27769d698cd71e81f945bbc09e5df09d8de29b67471015ecef9b49/tache-0.2.0.tar.gz" } ] }