用于生成缓存密钥的redis支持的工具。

alke的Python项目详细描述


#alkey

[alkey][]是一个[redis][]支持的工具,用于生成缓存密钥,在[sqlalchemy][]模型实例更改时隐式更新/无效,例如:


#当"instance1"或"instance2"更改时,"cache\u key"将无效。
cache\u key=key\u generator(instance1,实例2)


它可以被任何有权访问[redis][]的[sqlalchemy][]应用程序使用。
此外,它还与[pyramid][]框架集成(可选):
`config.include`包并使用,例如:

cache_key=request.cache_key(request.context)


只要模型实例具有唯一的"id"属性,则每当更新或删除实例时,此
标记都将更改。此外,
alkey针对每个数据库表维护一个全局写令牌和一个令牌。
您可以使用它们生成无效的缓存密钥:

*当*实例*更改时
*当*表*更改时;或当*任何*更改时

*主要算法是记录实例在刷新到会话的新列表、脏列表或已删除列表中的数据库时发生了更改(格式为alkey:tablename-row-id的标识符,例如alkey:users-1的标识符存储在redis集中)。
然后,当提交会话的事务时,每个记录的
实例的令牌(加上它们的表和全局写令牌)都将更新。这意味着
包含令牌的缓存密钥将丢失,从而导致重新生成缓存值



当在缓存中查找尚未
的实例时,将生成新令牌。因此,如果丢失/刷新
redis数据,密钥将始终无效。

>;还要注意,在随后回滚的事务中记录的更改将被丢弃(即:令牌将不会更新)
*除非*回滚事务是子事务。在这种情况下,如果应用程序代码显式使用子事务,则回滚可能会导致不必要的缓存未命中。


配置[redis client][]:

*`redis url`:包含任何身份验证信息的连接字符串,例如:
`redis://username:password@hostname:port`
*`redis db`:默认为'0`
*`redis最大连接数`:客户端的最大连接数
连接池(默认为未设置)

例如:

from alkey import events
from myapp import session
以下类型作为生成缓存键的位置参数:

*sqlalchemy model instances
*alkey:tablename\row\u id`
*sqlalchemy model classes
*alkey:tablename\tablename格式的模型类标识符` alkey.constants.global_write_标记`,其值为'alkey:*`
*可以强制为Unicode字符串的任意值

,例如,使用'alkey.cache.get_cache_key_generator'工厂来实例化:


from alkey.cache import get_cache_key_generator

key_generator=get_cache_key_generator()
cache_key=key_generator(例如,alkey:users_1',1,'foo',{bar':'baz'})

gine您有一个"users"表,其中"user"是一个实例,其"id"为"1":


更新或删除。
cache_key=key_generator(user.u class_uu)
cache_key=key_u generator('alkey:users 35;*')

更新或删除。
cache_key=key_generator('alkey:**')


或者您可以使用'alkey.cache.get_token'直接获取实例令牌,例如:

from alkey.cache import get庠token
from alkey.client import get庠redis庠client

redis庠client=get庠redis庠client()

token=get庠token(redis庠client,user)
token=get庠token(redis庠client,'alkey:users 1')


使用[Pyramid_-BaseModel][]线程本地作用域会话。
若要使用其他会话类,请在.ini设置中提供指向该类的点路径作为
`alkey.session_-cls'。例如:

alkey.session\u cls=myapp.model.session

"任意字符串")

或例如:在[mako模板][]:

<;%page cached=true,cache_key=${request.cache_key(1,self.uri,instance)}/>;


要运行测试,
请安装"mock"、"nose"和"coverage",或者在
"alkey.tests:integrationtest"中修改"setup"方法,或者在
"redis://localhost:6379"中提供redis db。然后,例如:

$nosetests alkey——带doctest——带coverage——cover tests——cover package alkey
……………
name stmts miss cover missing
………
100%
alkey.cache 74 0 100%
alkey.client 73 0 100%
alkey.constants 6 0 100%
alkey.events 12 0 100%
alkey.handle 76 0 100%
alkey.interfaces 6 0100%
酒精测试184 0 100%
酒精测试30 0 100%
----------
总计472 0 100%
-----------------------------------
在0.566s中运行了26个测试


ok

[redis]:http://redis.io
[sqlalchemy]:http://www.sqlalchemy.org/
[redis client]:https://github.com/andymccurdy/redis py
[刷新前]:http://docs.sqlalchemy.org/ru/latest/orm/events.html sqlalchemy.orm.events.sessionEvents.before flush
[提交后]:http://docs.sqlalchemy.org/ru/latest/orm/events.html sqlalchemy.orm.events.sessionEvents.after提交
[金字塔]:http://docs.pylonsproject.org/projects/pyramd/en/latest
[mako-template]:http://www.makotemplates.org/
[pyramid-basemodel]:http://github.com/thruflo/pyramid-basemodel
[environment variables]:http://blog.akash.im/per-project-environment variables with forema
[heroku-addons]:https://www.google.co.uk/search?q=heroku+插件+redis

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

推荐PyPI第三方库


热门话题
Java:如何使用另一个类中的对象   如何在Java中迭代旁遮普语(阿拉伯语)?   类Java嵌套ArrayList返回对象   java正则表达式以匹配“:”之后包含的字符串   java为什么main()很好地显示“Lukaku”并包含_names()返回null?   java嵌套循环,无法理解如何编写此代码   java使用maven动物嗅探器插件检查自己的API   java上传的文件创建保存以备将来在GWT服务器端使用   java转换为Dalvik格式失败65536限制   Java后端的javascript最佳RIA工具   amazon web服务如何将tar文件从amazonS3 bucket提取到Java中的另一个s3   java如何在hibernate搜索中实现对int值的搜索?   使用Maven初始化引导层JavaFX时发生java错误   java Google登录API例外:10:   java Glassfish 3.1.2加载本机库(.dll)   java在join操作中使用TumblingWindow,但没有将任何元素传输到my JoinFunction   IBatis+Java:检索HashMap   多线程java与scala在单独线程上读取文件