多后端缓存

pycached的Python项目详细描述


支持多个后端(内存、redis)的缓存。 基于aiocache的同步库。

https://travis-ci.org/fanjindong/pycached.svg?branch=masterhttps://codecov.io/gh/fanjindong/pycached/branch/master/graph/badge.svghttps://badge.fury.io/py/pycached.svghttps://img.shields.io/pypi/pyversions/pycached.svghttps://api.codacy.com/project/badge/Grade/96f772e38e63489ca884dbaf6e9fb7fdhttps://img.shields.io/badge/code%20style-black-000000.svg

这个库的目的是简单而不是专门化。所有缓存都包含相同的最小接口,该接口包含以下功能:

  • ^ TT1} $:仅在密钥不存在时添加密钥/值。
  • get:检索由键标识的值。
  • set:设置键/值。
  • multi_get:检索多个键/值。
  • multi_set:设置多个键/值。
  • {TT6}$:否则,如果密钥存在错误,则返回true。
  • increment:增加存储在给定密钥中的值。
  • delete:删除键并返回已删除的项目数。
  • clear:清除存储的项。
  • raw:使用底层客户端执行指定的命令。

Installing

  • pip install pycached
  • pip install pycached[redis]
  • pip install pycached[msgpack]

Usage

使用缓存非常简单

>>>fromfrompycachedimportCache>>>cache=Cache(Cache.MEMORY)# Here you can also use Cache.REDIS and Cache.MEMCACHED, default is Cache.MEMORY>>>cache.set('key','value')True>>>cache.get('key')'value'

或作为装饰工

importtimefromcollectionsimportnamedtuplefrompycachedimportcached,Cache,RedisCachefrompycached.serializersimportPickleSerializer# With this we can store python objects in backends like Redis!Result=namedtuple('Result',"content, status")@cached(ttl=10,cache=RedisCache,key="key",serializer=PickleSerializer(),port=6379,namespace="main")defcached_call():print("Sleeping for three seconds zzzz.....")time.sleep(3)returnResult("content",200)defrun():cached_call()cached_call()cached_call()cache=Cache(Cache.REDIS,endpoint="127.0.0.1",port=6379,namespace="main")cache.delete("key")if__name__=="__main__":run()

建议使用cache构造函数实例化新缓存。但是,您也可以使用pycached.rediscachepycached.simplememorycache直接实例化。

您还可以设置缓存别名,使其易于重用配置

frompycachedimportcaches# You can use either classes or strings for referencing classescaches.set_config({'default':{'cache':"pycached.SimpleMemoryCache",'serializer':{'class':"pycached.serializers.StringSerializer"}},'redis_alt':{'cache':"pycached.RedisCache",'endpoint':"127.0.0.1",'port':6379,'timeout':1,'serializer':{'class':"pycached.serializers.PickleSerializer"},'plugins':[{'class':"pycached.plugins.HitMissRatioPlugin"},{'class':"pycached.plugins.TimingPlugin"}]}})defdefault_cache():cache=caches.get('default')# This always returns the SAME instancecache.set("key","value")assertcache.get("key")=="value"defalt_cache():cache=caches.create('redis_alt')# This creates a NEW instance on every callcache.set("key","value")assertcache.get("key")=="value"deftest_alias():default_cache()alt_cache()caches.get('redis_alt').delete("key")if__name__=="__main__":test_alias()

How does it work

pycached提供3个主要实体:

  • 后端:允许指定要用于缓存的后端。当前支持:simplememorycache,使用redis重新缓存。
  • serializers:序列化和反序列化代码和后端之间的数据。这允许您将任何python对象保存到缓存中。当前支持:StringSerializer、PickleSerializer、JsonSerializer和MsgPackSerializer。但你也可以定制。
  • plugins:实现一个hooks系统,允许在每个命令之前和之后执行额外的行为。
If you are missing an implementation of backend, serializer or plugin you think it could be interesting for the package, do not hesitate to open a new issue.
docs/images/architecture.png

这3个实体在一些缓存操作期间合并,以应用所需的命令(后端)、数据转换(序列化器)和前/后挂钩(插件)。为了更好地了解发生了什么,您可以在这里检查set函数如何在pycached中工作:

docs/images/set_operation_flow.png

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
固件文件的java容器:二进制数据部分的集合   java如何查找和跳过单词开头和结尾的特殊字符   JavaFXMaven插件:com。zenjava jfx:jar是否包含所有依赖项?   用户界面使Java Netbeans GUI生成器在读取文本文件的某些部分之前等待事件发生   由于Kotlin中存在未解析的引用,java无法设置文本或可绘制   java JSON解析嵌套数组对象   java如何使用Hibernate(EntityManager)或JPA调用Oracle函数或过程   链接列表末尾的java插入节点   jaxb EclipseLink Moxy:Java类型绑定不使用子类型(组合)   java为什么选择事件源模式中的事件流?   java为什么我的Eclipse项目与ClearCase没有关联?   通过Talend正确完成java数据库迁移   java如何自动调用数字键盘?   swing Java反射,投射到未知对象?   正则表达式如何在java中提取文本文件的键和值?   java rmi应用程序   线程“main”java中出现异常。lang.NoClassDefFoundError在我的测试中出现错误   java open失败:API 21中的EACCES(权限被拒绝)   java(RxJava)移植的Groovy方法不起作用   java AndroidStudio:如何在片段中移动按钮