连接到 Redis

通用客户端

class redis.client.Redis(host='localhost', port=6379, db=0, password=None, socket_timeout=None, socket_connect_timeout=None, socket_keepalive=None, socket_keepalive_options=None, connection_pool=None, unix_socket_path=None, encoding='utf-8', encoding_errors='strict', charset=None, errors=None, decode_responses=False, retry_on_timeout=False, ssl=False, ssl_keyfile=None, ssl_certfile=None, ssl_cert_reqs='required', ssl_ca_certs=None, ssl_ca_path=None, ssl_check_hostname=False, ssl_password=None, max_connections=None, single_connection_client=False, health_check_interval=0, client_name=None, username=None, retry=None, redis_connect_func=None)[source]

Redis 协议的实现。

此抽象类提供了一个 Python 接口,用于所有 Redis 命令和 Redis 协议的实现。

管道继承自此类,实现命令如何发送和接收给 Redis 服务器。根据配置,实例将使用 ConnectionPool 或 Connection 对象与 redis 通信。

execute_command(*args, **options)[source]

执行命令并返回解析后的响应

classmethod from_url(url, **kwargs)[source]

返回一个从给定 URL 配置的 Redis 客户端对象

例如

redis://[[username]:[password]]@localhost:6379/0
rediss://[[username]:[password]]@localhost:6379/0
unix://[[username]:[password]]@/path/to/socket.sock?db=0

支持三种 URL 方案

用户名、密码、主机名、路径和所有查询字符串值都通过 urllib.parse.unquote 传递,以便用其对应的字符替换任何百分比编码的值。

有几种方法可以指定数据库编号。将使用找到的第一个值

  1. 一个 db 查询字符串选项,例如 redis://127.0.0.1?db=0
  2. 如果使用 redis:// 或 rediss:// 方案,则使用 url 的路径参数,例如 redis://127.0.0.1/0
  3. 一个 db 关键字参数传递给此函数。

如果没有指定这些选项,则使用默认的 db=0。

所有查询字符串选项都转换为相应的 Python 类型。布尔参数可以使用字符串值“True”/“False”或“Yes”/“No”指定。无法正确转换的值会导致引发 ValueError。解析后,查询字符串参数和关键字参数将传递给 ConnectionPool 的类初始化器。在出现冲突参数的情况下,查询字符串参数始终优先。

get_connection_kwargs()[source]

获取连接的关键字参数

get_encoder()[source]

获取连接池的编码器

load_external_module(funcname, func)[source]

此函数可用于将外部定义的 redis 模块及其命名空间添加到 redis 客户端。

funcname - 包含要创建的函数名称的字符串 func - 要添加到此类的函数。

例如:假设有一个名为 foomod 的自定义 redis 模块,它在 redis 中创建名为“foo.dothing”和“foo.anotherthing”的命令。要将函数函数加载到此命名空间中

from redis import Redis from foomodule import F r = Redis() r.load_external_module(“foo”, F) r.foo().dothing(‘your’, ‘arguments’)

有关具体示例,请参见 tests/test_connection.py::test_loading_external_modules 中 redisjson 模块的重新导入。

lock(name, timeout=None, sleep=0.1, blocking_timeout=None, lock_class=None, thread_local=True)[source]

使用键 name 返回一个新的 Lock 对象,该对象模拟 threading.Lock 的行为。

如果指定,timeout 表示锁的最大生命周期。默认情况下,它将保持锁定状态,直到调用 release()。

sleep 表示当锁处于阻塞模式且另一个客户端当前持有锁时,每次循环迭代的睡眠时间。

blocking_timeout 表示尝试获取锁的最大时间(以秒为单位)。None 值表示永远尝试。 blocking_timeout 可以指定为浮点数或整数,两者都表示等待的秒数。

lock_class 强制使用指定的锁实现。

thread_local 指示锁令牌是否放置在线程本地存储中。默认情况下,令牌放置在线程本地存储中,因此线程只能看到自己的令牌,而不会看到另一个线程设置的令牌。考虑以下时间线

时间:0,线程-1 获取 my-lock,超时时间为 5 秒。
线程-1 将令牌设置为“abc”。
时间:1,线程-2 使用
Lock 实例阻塞尝试获取 my-lock
时间:5,线程-1 尚未完成。redis 过期了锁
键。
时间:5,线程-2 获取 my-lock,因为它现在可用。
线程-2 将令牌设置为“xyz”。
时间:6,线程-1 完成其工作并调用 release()。如果
令牌存储在线程本地存储中,则线程-1 将看到令牌值为“xyz”,并且能够成功释放线程-2 的锁。

在某些用例中,需要禁用线程本地存储。例如,如果您有代码,其中一个线程获取锁并将该锁实例传递给工作线程以供稍后释放。如果在这种情况下未禁用线程本地存储,则工作线程将看不到获取锁的线程设置的令牌。我们的假设是这些情况并不常见,因此默认情况下使用线程本地存储。

parse_response(connection, command_name, **options)[source]

解析来自 Redis 服务器的响应。

pipeline(transaction=True, shard_hint=None)[source]

返回一个新的管道对象,该对象可以将多个命令排队以供稍后执行。 transaction 指示是否应原子地执行所有命令。除了使一组操作原子化之外,管道还有助于减少客户端和服务器之间的来回开销。

pubsub(**kwargs)[source]

返回一个发布/订阅对象。使用此对象,您可以订阅频道并监听发布到这些频道的消息。

set_response_callback(command, callback)[source]

设置自定义响应回调

transaction(func, *watches, **kwargs)[source]

用于将可调用对象 func 作为事务执行的便捷方法,同时监视 watches 中指定的所有键。可调用对象 ‘func’ 应该期望一个参数,该参数是一个 Pipeline 对象。

连接池

class redis.connection.ConnectionPool(connection_class=<class 'redis.connection.Connection'>, max_connections=None, **connection_kwargs)[source]

创建连接池。 如果 max_connections 设置,则当池达到限制时,此对象会引发 ConnectionError

默认情况下,除非指定了 connection_class,否则将创建 TCP 连接。对于 Unix 套接字,请使用 UnixDomainSocketConnection

任何其他关键字参数都将传递给 connection_class 的构造函数。

disconnect(inuse_connections=True)[source]

断开池中的连接

如果 inuse_connections 为 True,则断开当前正在使用的连接,可能由其他线程使用。否则,只断开池中处于空闲状态的连接。

类方法 from_url(url, **kwargs)[源代码]

从给定的 URL 配置连接池。

例如

redis://[[username]:[password]]@localhost:6379/0
rediss://[[username]:[password]]@localhost:6379/0
unix://[[username]:[password]]@/path/to/socket.sock?db=0

支持三种 URL 方案

用户名、密码、主机名、路径和所有查询字符串值都通过 urllib.parse.unquote 传递,以便用其对应的字符替换任何百分比编码的值。

有几种方法可以指定数据库编号。将使用找到的第一个值

  1. 一个 db 查询字符串选项,例如 redis://127.0.0.1?db=0
  2. 如果使用 redis:// 或 rediss:// 方案,则使用 url 的路径参数,例如 redis://127.0.0.1/0
  3. 一个 db 关键字参数传递给此函数。

如果没有指定这些选项,则使用默认的 db=0。

所有查询字符串选项都转换为相应的 Python 类型。布尔参数可以使用字符串值“True”/“False”或“Yes”/“No”指定。无法正确转换的值会导致引发 ValueError。解析后,查询字符串参数和关键字参数将传递给 ConnectionPool 的类初始化器。在出现冲突参数的情况下,查询字符串参数始终优先。

get_connection(command_name, *keys, **options)[源代码]

从池中获取连接。

get_encoder()[源代码]

根据编码设置返回编码器。

make_connection()[源代码]

创建新的连接。

release(connection)[源代码]

将连接释放回池中。