跳转到主要内容

一个非常简单的MicroPython Redis客户端库(不仅限于)

项目描述

概述

PicoRedis 是一个非常简单的MicroPython Redis客户端库。

它做什么

  • 支持Redis Redis Serialization Protocol (RESP).

  • 通过TCP连接到Redis服务器。

  • 发送Redis命令并以简单、阻塞的方式接收和解析响应。

  • 支持MicroPython(带有usocket和uselect模块的Unix和裸机端口)、CPython和PyPy(3.4+,2.7+未测试)。

它不做什么

  • 解析响应超出基本RESP类型的反序列化(简单字符串、错误、批量字符串、整数和数组)。

  • 解码响应字节数组,除了错误消息。

  • 支持订阅/发布协议。

  • 支持SSL/TLS(尚未)。

  • 异步I/O。

用法

>>> from picoredis import Redis
>>> redis = Redis()  # server defaults to 127.0.0.1 port 6379
>>> redis.do_cmd('PING', 'Hello World!')
b'Hello World!'

与使用 do_cmd 方法不同,可以直接调用 Redis 实例

>>> redis('SET', 'foo', 'bar')
b'OK'
>>> redis('GET', 'foo')
b'bar'  # string responses are always byte strings

或者您可以在 Redis 实例上调用任意方法,方法名将被用作 Redis 命令

>>> redis.hset('myhash', 'key1', 42)
1
>>> redis.hkeys('myhash')
[b'key1']

您可以使用任何只包含字母的方法名,但不能是 connectclosedebug(以及 do_cmd),这些已经被用作实例属性或方法名。如果名称与有效 Redis 命令不匹配,服务器将返回错误,并引发 RedisError 异常

>>> redis.bogus('spam!')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "picoredis.py", line 72, in <lambda>
  File "picoredis.py", line 66, in do_cmd
  File "picoredis.py", line 82, in _read_response
RedisError: ('ERR', "unknown command 'bogus'")

连接

当您创建一个 Redis 实例时,它立即尝试连接到 Redis 服务器。默认主机和端口分别是 127.0.0.16379

您可以使用 hostport 关键字参数设置要连接的 Redis 服务器的主机名或 IP 地址和端口号

>>> redis = Redis('192.168.1.100')
>>> redis = Redis(port=6380)
>>> redis = Redis('192.168.1.100', 6380)
>>> redis = Redis(host='192.168.1.100')
>>> redis = Redis(host='192.168.1.100', port=6380)

您可以使用毫秒(默认 3000)作为 timeout 关键字参数设置 TCP 套接字超时

>>> redis = Redis(timeout=10000)

如果从服务器读取响应,并且服务器在超时时间内没有返回任何数据,将引发 RedisTimeout 异常。

要关闭与服务器的连接,请使用 close() 方法

>>> redis.close()
>>> redis.ping()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "picoredis.py", line 89, in <lambda>
  File "picoredis.py", line 75, in do_cmd
RedisError: Not connected: use 'connect()' to connect to Redis server.

要再次打开新的连接,请使用 connect 方法。您可以传递不同的主机名和 / 或端口号,它们将覆盖实例创建时给出的那些

>>> redis.connect('redis.myserver.com')
>>> redis._host
'redis.myserver.com'

调试输出

要打开打印发送到和从 Redis 服务器接收到的原始消息,在创建实例时传递 debug=True 或将其实例的 debug 属性设置为 True

>>> redis = Redis(debug=True)
>>> redis.hkeys('myhash')
SEND: '*2\r\n$5\r\nhkeys\r\n$6\r\nmyhash\r\n'
RECV: b'*1\r\n'
RECV: b'$4\r\n'
RECV: b'key1\r\n'
[b'key1']

技巧

如果您需要经常将响应解析为 Redis 命令,只需在子类中添加一个包装方法。例如,以下是如何获取 Redis 服务器支持的命令列表作为字符串列表的方法

>>> class MyRedis(Redis):
...     def command_list(self):
...         return sorted([cmd[0].decode('utf-8')
...                        for cmd in self.do_cmd('command')])
>>> redis = MyRedis()
>>> redis.command_list()
['append', 'asking', 'auth', 'bgrewriteaof', 'bgsave', 'bitcount', 'bitfield',
 ..., 'zunionstore']

警告:Redis 服务器发送的此命令响应可能相当大,并且可能在内存受限的设备(如基于 ESP8266 的板)上运行时引发 MemoryError

安装

在 CPython 和 PyPy 上,使用 pip 按照常规安装

$ pip install picoredis

在 MicroPython 上,只需从存储库中下载 picoredis.py 文件,对于 Unix 端口,将其放入您的 MICROPYPATH 目录中(通常为 ~/.micropython/lib),或者对于基础金属端口(esp8266stm32wipy 等)将其上传到 MicroPython 板的闪存存储中,例如使用 ampy

$ curl -O https://raw.githubusercontent.com/SpotlightKid/picoredis/master/picoredis/picoredis.py
$ ampy -p /dev/ttyUSB0 put picoredis.py

您还可以使用 mpy-cross 编译 picoredis.py 模块,并使用生成的 picoredis.mpy 文件作为纯 Python 版本的替代品。这将为您在 MicroPython 板上节省大量内存,因为通常在导入模块时发生的字节码编译步骤可以跳过

$ mpy-cross picoredis.py
$ ampy -p /dev/ttyUSB0 put picoredis.mpy

许可证

PicoRedis 由 Christopher Arndt 编写并享有版权,2017。

它根据 MIT 许可证分发,PicoRedis 是免费和开源软件。

致谢

从以下项目中获得了灵感和代码想法

由以下组织支持