跳转到主要内容

hiredis的Python封装

项目描述

hiredis-py

Build Status License pypi

Python扩展,封装了hiredis中的协议解析代码。它主要加快了多批量回复的解析速度。

如何使用Redis?

在Redis大学免费学习

使用Redis Launchpad加速构建

尝试Redis Cloud

深入了解开发者教程

加入Redis社区

在Redis工作

安装

hiredis-py可在PyPI上找到,并且可以通过以下方式安装

pip install hiredis

构建和测试

构建此存储库需要递归检出子模块并构建hiredis。以下示例显示了如何克隆、编译和运行测试。请注意 - 您需要安装gcc。

git clone --recurse-submodules https://github.com/redis/hiredis-py
python setup.py build_ext --inplace
python -m pytest

要求

hiredis-py需要 Python 3.8+

确保在安装hiredis-py时Python开发头文件可用。在Ubuntu/Debian系统上,使用apt-get install python3-dev安装它们。

用法

hiredis模块包含Reader类。此类负责解析从Redis连接读取的数据流中的回复。它不包含处理I/O的功能。

回复解析器

Reader类在解析数据流中的回复时有两个方法。方法Reader.feed接受一个字符串参数,并将其附加到内部缓冲区。方法Reader.gets读取此缓冲区,并在缓冲区包含完整回复时返回一个回复。如果feed的单次调用包含多个回复,则应多次调用gets以提取所有回复。

示例

>>> reader = hiredis.Reader()
>>> reader.feed("$5\r\nhello\r\n")
>>> reader.gets()
b'hello'

如果缓冲区不包含完整回复,gets将返回False。这意味着需要额外的数据,并且在再次调用gets之前应再次调用feed。或者,您可以通过参数提供自定义哨兵对象,这对于支持原生布尔类型的RESP3协议很有用。

示例

>>> reader.feed("*2\r\n$5\r\nhello\r\n")
>>> reader.gets()
False
>>> reader.feed("$5\r\nworld\r\n")
>>> reader.gets()
[b'hello', b'world']
>>> reader = hiredis.Reader(notEnoughData=Ellipsis)
>>> reader.gets()
Ellipsis

Unicode

hiredis.Reader能够将大量数据解码为Python支持的任何编码。为此,在初始化时指定用于解码回复的编码。

>>> reader = hiredis.Reader(encoding="utf-8", errors="strict")
>>> reader.feed(b"$3\r\n\xe2\x98\x83\r\n")
>>> reader.gets()
'☃'

将尝试使用指定的编码和错误处理器解码大量数据。如果错误处理器为'strict'(默认值),则在数据无法解码时引发UnicodeDecodeError。这与Python的默认行为相同。其他有效的errors值包括'replace''ignore''backslashreplace'。有关这些错误处理器的更多信息,请参阅此处

当找不到指定的编码时,在调用gets以获取第一个包含大量数据的回复时将引发LookupError

错误处理

当发生协议错误(由于多个线程使用相同的套接字或其他导致损坏流的条件)时,将引发错误hiredis.ProtocolError。由于以惰性方式读取缓冲区,因此它只会在调用gets并且缓冲区中的第一个回复包含错误时引发。无法从错误的协议状态中恢复,因此在这种情况下,向Reader提供数据的I/O代码应可能重新连接。

Redis可以回复错误回复(-ERR ...)。对于这些回复,返回自定义错误类hiredis.ReplyError,但不会引发。

当应使用其他错误类型时(因此现有代码无需更改其except子句),可以使用protocolErrorreplyError关键字初始化Reader。这些关键字应包含一个,它是Exception的子类。如果没有提供,则Reader将使用默认的错误类型。

基准测试

存储库中包含一个位于benchmark目录的基准测试脚本,它使用gevent进行非阻塞I/O并使用redis-py处理连接。这些基准测试使用redis-py的修补版本进行,该版本在可用时使用hiredis-py。

所有基准测试都是使用10个并发连接进行的。

  • SET key value + GET key
    • redis-py: 11.76 Kops
    • redis-py with hiredis-py: 13.40 Kops
    • 改进:1.1倍

以下测试中的列表条目为5字节。

  • LRANGE list 0 9
    • redis-py: 4.78 Kops
    • redis-py with hiredis-py: 12.94 Kops
    • 改进:2.7倍
  • LRANGE list 0 99
    • redis-py: 0.73 Kops
    • redis-py with hiredis-py: 11.90 Kops
    • 改进:16.3倍
  • LRANGE list 0 999
    • redis-py: 0.07 Kops
    • redis-py with hiredis-py: 5.83 Kops
    • 改进:83.2倍

对于简单的SET/GET,吞吐量改进很小,但随着多批量回复的大小增加,性能改进也更大。

许可

该代码在hiredis许可之后以BSD许可发布。

支持者