跳转到主要内容

Django的完整功能异步Redis缓存后端。

项目描述

Django Async Redis

https://img.shields.io/pypi/v/django-async-redis.svg https://travis-ci.cn/Andrew-Chen-Wang/django-async-redis.svg?branch=master Documentation Status

简介

django-async-redis是Django的完整功能Redis缓存和会话后端。

要求

用户指南

安装

使用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_EXCEPTIONSDJANGO_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_EXCEPTIONSTrue,则默认为 __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 查询之外,您还可以使用 apersistaexpire 方法持久化具体的键或指定新的过期超时时间。

>>> 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 原子操作有限支持,例如 SETNXINCR 命令。

您可以通过后端的 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"

此外,aincradecr 方法在键包含的值适合它们时使用 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上的第一次发布。

项目详情


下载文件

为您的平台下载文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

django-async-redis-0.2.0.tar.gz (28.2 kB 查看哈希)

上传时间

构建分布

django_async_redis-0.2.0-py2.py3-none-any.whl (21.0 kB 查看哈希)

上传时间 Python 2 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面