连接到 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 通信。
-
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 方案
- redis:// 创建一个 TCP 套接字连接。更多信息请参见:<https://www.iana.org/assignments/uri-schemes/prov/redis>
- rediss:// 创建一个 SSL 封装的 TCP 套接字连接。更多信息请参见:<https://www.iana.org/assignments/uri-schemes/prov/rediss>
unix://
: 创建一个 Unix 域套接字连接。
用户名、密码、主机名、路径和所有查询字符串值都通过 urllib.parse.unquote 传递,以便用其对应的字符替换任何百分比编码的值。
有几种方法可以指定数据库编号。将使用找到的第一个值
- 一个
db
查询字符串选项,例如 redis://127.0.0.1?db=0 - 如果使用 redis:// 或 rediss:// 方案,则使用 url 的路径参数,例如 redis://127.0.0.1/0
- 一个
db
关键字参数传递给此函数。
如果没有指定这些选项,则使用默认的 db=0。
所有查询字符串选项都转换为相应的 Python 类型。布尔参数可以使用字符串值“True”/“False”或“Yes”/“No”指定。无法正确转换的值会导致引发
ValueError
。解析后,查询字符串参数和关键字参数将传递给ConnectionPool
的类初始化器。在出现冲突参数的情况下,查询字符串参数始终优先。
-
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 的锁。
在某些用例中,需要禁用线程本地存储。例如,如果您有代码,其中一个线程获取锁并将该锁实例传递给工作线程以供稍后释放。如果在这种情况下未禁用线程本地存储,则工作线程将看不到获取锁的线程设置的令牌。我们的假设是这些情况并不常见,因此默认情况下使用线程本地存储。
-
classmethod
连接池¶
-
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 方案
- redis:// 创建一个 TCP 套接字连接。更多信息请参见:<https://www.iana.org/assignments/uri-schemes/prov/redis>
- rediss:// 创建一个 SSL 封装的 TCP 套接字连接。更多信息请参见:<https://www.iana.org/assignments/uri-schemes/prov/rediss>
unix://
: 创建一个 Unix 域套接字连接。
用户名、密码、主机名、路径和所有查询字符串值都通过 urllib.parse.unquote 传递,以便用其对应的字符替换任何百分比编码的值。
有几种方法可以指定数据库编号。将使用找到的第一个值
- 一个
db
查询字符串选项,例如 redis://127.0.0.1?db=0 - 如果使用 redis:// 或 rediss:// 方案,则使用 url 的路径参数,例如 redis://127.0.0.1/0
- 一个
db
关键字参数传递给此函数。
如果没有指定这些选项,则使用默认的 db=0。
所有查询字符串选项都转换为相应的 Python 类型。布尔参数可以使用字符串值“True”/“False”或“Yes”/“No”指定。无法正确转换的值会导致引发
ValueError
。解析后,查询字符串参数和关键字参数将传递给ConnectionPool
的类初始化器。在出现冲突参数的情况下,查询字符串参数始终优先。
-