Django的完整功能异步Redis缓存后端。
项目描述
Django Async Redis
简介
django-async-redis是Django的完整功能Redis缓存和会话后端。
免费软件:Apache软件许可证2.0
要求
用户指南
安装
使用pip安装
$ python -m pip install django-async-redis
配置为缓存后端
要开始使用django-async-redis,您应将Django缓存设置更改为如下:
CACHES = {
"default": {
"BACKEND": "django_async_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_async_redis.client.DefaultClient",
}
}
}
django-async-redis使用aioredis的本地URL表示法连接字符串,它允许更好的互操作性,并以更“标准”的方式具有连接字符串。以下是一些示例
redis://[:password]@localhost:6379/0
rediss://[:password]@localhost:6379/0
unix://[:password]@/path/to/socket.sock?db=0
支持三种URL方案
redis://:创建一个正常的TCP套接字连接
rediss://:创建一个SSL封装的TCP套接字连接
unix://:创建一个Unix域套接字连接
有几种方式可以指定数据库编号
数据库查询字符串选项,例如 redis://localhost?db=0
如果使用 redis:// 方案,URL 的路径参数,例如 redis://localhost/0
高级用法
Pickle 版本
对于几乎所有的值,django-async-redis 使用 pickle 序列化对象。
默认使用最新可用的 pickle 版本。如果您想设置具体版本,可以使用 PICKLE_VERSION 选项进行设置
CACHES = {
"default": {
# ...
"OPTIONS": {
"PICKLE_VERSION": -1 # Use the latest protocol version
}
}
}
Memcached 异常行为
在某些情况下,当 Redis 仅用于缓存时,您可能不希望在 Redis 不可用时不抛出异常。这是 memcached 后端中的默认行为,并且可以在 django-async-redis 中模拟。
要设置类似于 memcached 的行为(忽略连接异常),您应在您的缓存配置中设置 IGNORE_EXCEPTIONS 设置
CACHES = {
"default": {
# ...
"OPTIONS": {
"IGNORE_EXCEPTIONS": True,
}
}
}
此外,您可以将相同的设置应用于所有配置的缓存,您可以在您的设置中设置全局标志
DJANGO_ASYNC_REDIS_IGNORE_EXCEPTIONS = True
记录被忽略的异常
当使用 IGNORE_EXCEPTIONS 或 DJANGO_ASYNC_REDIS_IGNORE_EXCEPTIONS 忽略异常时,您可以使用设置文件中的全局变量 DJANGO_ASYNC_REDIS_LOG_IGNORED_EXCEPTIONS 可选地记录异常
DJANGO_ASYNC_REDIS_LOG_IGNORED_EXCEPTIONS = True
如果您希望指定输出异常的记录器,只需将全局变量 DJANGO_ASYNC_REDIS_LOGGER 设置为所需记录器的字符串名称和/或路径。如果没有指定记录器且 DJANGO_ASYNC_REDIS_LOG_IGNORED_EXCEPTIONS 为 True,则默认为 __name__
DJANGO_ASYNC_REDIS_LOGGER = 'some.specified.logger'
无限超时
django-async-redis 默认支持无限超时。它的工作方式与 Django BaseCache 后端指定的方式相同
timeout=0 立即使值过期。
timeout=None 无限超时
await cache.aset("key", "value", timeout=None)
从键获取 ttl(生存时间)
使用 Redis,您可以访问任何存储键的 ttl,为了实现这一点,django-async-redis 公开了 attl 函数。
它返回
如果键不存在(或已过期)则返回 0。
对于存在但没有任何过期的键返回 None。
对于任何具有过期时间的可挥发键返回 ttl 值。
>>> from django.core.cache import cache
>>> await cache.aset("foo", "value", timeout=25)
>>> await cache.attl("foo")
25
>>> await cache.attl("not-existent")
0
过期 & 持久化
除了简单的 ttl 查询之外,您还可以使用 apersist 和 aexpire 方法持久化具体的键或指定新的过期超时时间。
>>> await cache.aset("foo", "bar", timeout=22)
>>> await cache.attl("foo")
22
>>> await cache.apersist("foo")
>>> await cache.attl("foo")
None
>>> await cache.aset("foo", "bar", timeout=22)
>>> await cache.aexpire("foo", timeout=5)
>>> await cache.attl("foo")
5
批量扫描 & 删除键
django-async-redis 提供了一些额外的帮助方法,用于使用 glob 模式搜索或删除键。
>>> from django.core.cache import cache
>>> await cache.akeys("foo_*")
["foo_1", "foo_2"]
这样的简单搜索将返回所有匹配的值。在具有大量键的数据库中,这不是合适的方法。相反,您可以使用 aiter_keys 函数,它类似于 akeys 函数,但使用 Redis 服务器端游标。调用 aiter_keys 将返回一个生成器,然后您可以高效地遍历它。
>>> from django.core.cache import cache
>>> await cache.aiter_keys("foo_*")
<async_generator object algo at 0x7ffa9c2713a8>
>>> (await cache.aiter_keys("foo_*")).__anext__()
"foo_1"
对于删除键,您应使用 adelete_pattern,它与 akeys 函数具有相同的 glob 模式语法,并返回已删除键的数量。
>>> from django.core.cache import cache
>>> await cache.adelete_pattern("foo_*")
Redis 原生命令
django-async-redis 对一些 Redis 原子操作有限支持,例如 SETNX 和 INCR 命令。
您可以通过后端的 aset() 方法使用 SETNX 命令,其中带有 nx 参数
>>> from django.core.cache import cache
>>> await cache.aset("key", "value1", nx=True)
True
>>> await cache.aset("key", "value2", nx=True)
False
>>> await cache.aget("key")
"value1"
此外,aincr 和 adecr 方法在键包含的值适合它们时使用 Redis 原子操作。
请注意,将xx设置为True会覆盖aioredis的nx标志。
连接池
在幕后,django-async-redis使用底层的aioredis连接池实现,并提供了一种简单的方式来配置它。或者,您也可以直接为后端自定义连接/连接池的创建。
默认情况下,aioredis的行为是不关闭连接,在可能的情况下回收它们。
注意
由于大多数代码都是从django-redis迁移过来的,有一个情况需要猴子补丁。在django_async_redis.util中,我们实现了CacheKey,它继承自str,这有助于我们知道一个缓存键是否已经被创建。由于aioredis会检查缓存键的类型是否为str(以及其他类型),因此我不得不对该检查进行猴子补丁,以便CacheKey实例也可以被接受。
致谢
嘿,我是Andrew。我正在忙于大学,但我想要为Django的异步生态系统做出贡献。
大量的代码和文档是从django-redis中获取的,包括测试。我只是需要将一切迁移到asyncio和aioredis。
我使用了cookiecutter-pypackage来生成这个项目。
感谢Python Discord服务器的异步主题聊天,它帮助我理解何时使用协程而不是同步函数,以及@Bast和@hmmmm在一般情况下,因为他们是OG。
历史
0.1.0 (2020-09-25)
PyPI上的第一次发布。
项目详情
哈希 for django_async_redis-0.2.0-py2.py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d8d1eb6cf3b35708373beb2e18800f2eed3ee5dd4abc8b8e266ca5577f868f1e |
|
MD5 | c33c43efbf1d33bcac23a065f2ce50b0 |
|
BLAKE2b-256 | caf9e6886b0ddde55ccad7b395b840045e64ae77888eafb5febbaa8fbbe242ce |