跳转到主要内容

导出和加载Redis数据库

项目描述

https://api.travis-ci.org/p/redis-dump-load.png

将Redis数据集导出为适合长期存储的格式(目前为JSON),并可以从此类导出文件将数据加载回Redis。

特性

redis-dump-load

  • 支持所有Redis数据类型;

  • 导出TTL和过期时间;

  • 可以加载过期的键的TTL或原始过期时间;

  • 可以创建美观/可读的导出(键以排序顺序导出,输出缩进);

  • 在导出和加载时可以流式传输数据;

  • 可以作为更大程序中的模块或作为独立实用程序使用;

  • 使用与redis-dump兼容的输出格式。

用法

redis-dump-load可以作为模块使用,也可以作为命令行工具使用。

模块用法

redis-dump-load导出了一个类似于pickle的接口,即load、loads、dump和dumps函数。例如

import redisdl

json_text = redisdl.dumps()

with open('path/to/dump.json', 'w') as f:
    # streams data
    redisdl.dump(f)

json_text = '...'
redisdl.loads(json_text)

with open('path/to/dump.json') as f:
    # streams data if ijson or jsaone are installed
    redisdl.load(f)

有关流式传输的更多信息,请参阅下面的流式传输部分。

导出和加载方法接受选项作为关键字参数

json_text = redisdl.dumps(encoding='iso-8859-1', pretty=True)

应该始终以关键字的形式传递参数,即不要依赖于参数当前列出的顺序。除非另有说明,选项采用字符串值。选项如下

  • host:Redis服务器的名称或IP地址

  • port:Redis服务器的端口号

  • unix_socket_path:通过Unix套接字连接Redis,而不是TCP/IP;指定套接字的路径

  • password:指定连接到Redis的密码

  • db(整数):连接到的Redis数据库

  • encoding:用于编码或解码数据的编码,请参阅下面的Unicode部分

  • pretty(布尔值,仅用于转储):生成易于阅读的格式化的JSON;目前这会使dump将整个数据集加载到内存中,而不是流式传输

  • keys(仅用于转储):仅转储与指定模式匹配的键

  • use_expireat(布尔值,仅用于加载):在加载即将过期的键时,优先使用expireat而不是ttl

  • empty(布尔值,仅用于加载):在加载数据之前清空Redis数据集

  • streaming_backend(字符串):当通过load方法加载时使用的流式传输后端,如果已安装ijsonjsaone并且使用了流式传输

命令行使用

redisdl.py可以作为以下命令行工具使用

# dump database 0
./redisdl.py > dump.json
./redisdl.py -o dump.json

# load into database 0
./redisdl.py -l < dump.json
./redisdl.py -l dump.json

为了方便,redisdl.py可以按照以下方式硬链接或软链接

ln redisdl.py redis-dump
ln redisdl.py redis-load

现在可以这样使用

# dump database 0
./redis-dump > dump.json
./redis-dump -o dump.json

# load into database 0
./redis-load < dump.json
./redis-load dump.json

符号链接也有效。可执行文件名中的“load”触发加载模式,“dump”触发转储模式,否则默认为转储模式,-l选项切换到加载模式。

当作为命令行工具调用redisdl时,接受模块API支持的所有选项。命令行选项如下

  • -h/--help:帮助文本

  • -H HOST/--host HOST:指定Redis主机

  • -p PORT/--port PORT:指定Redis端口

  • -s SOCKET_PATH/--socket SOCKET_PATH:连接到指定路径的Unix套接字

  • -w PASSWORD/--password PASSWORD:连接到Redis时使用的密码

  • -d DATABASE/--db DATABASE:连接到的Redis数据库(整数)

  • -k PATTERN/--keys PATTERN(仅用于转储):仅转储与指定glob-style模式匹配的键

  • -E ENCODING/-encoding ENCODING:指定要使用的编码

  • -o PATH/--output PATH:将转储写入PATH而不是标准输出

  • -y/--pretty(仅用于转储):格式化打印JSON

  • -A/--use-expireat(仅用于加载):在转储中使用expireat而不是ttl

  • -e/--empty(仅用于加载):在加载数据之前清空Redis数据集

  • -B BACKEND/--backend BACKEND(仅用于加载):要使用的流式传输后端

流式传输

dump将流式传输数据,除非提供了pretty并设置为True

如果已安装 ijsonjsaone,则 load 将会流式传输数据。要确定 redis-dump-load 是否支持流式数据加载,请检查 redisdl.have_streaming_load 变量。还存在 redisdl.have_ijsonredisdl.have_jsaone 变量,表示相应库的存在。

redis-dump-load 优先选择 ijson 而不是 jsaone,并且默认情况下不指定 ijson 的后端,这意味着将使用 ijson 的纯 Python 后端。要请求特定的后端,可以将它按照以下方式传递给 load 方法

redisdl.load(io, streaming_backend='ijson-yajl2')

… 或者按以下方式全局设置所需的后端

redisdl.streaming_backend = 'ijson-yajl2'

后端参数的形式为“library-library backend”,例如:- ijson 选择 ijson 的默认后端,目前是纯 Python 的。 - ijson-yajl2 选择带有 yajl2 后端的 ijson。 - yajl2ijson-yajl2 相同,以兼容较旧的 redis-dump-load 版本。 - jsaone 选择 jsaone 后端。

注意:流式加载比批量加载慢得多。要强制批量加载文件,请在内存中读取文件并调用 loads 而不是 load

在 redis-dump-load 版本 1.0 中增加了 jsaone 支持。

TTL、EXPIRE 和 EXPIREAT

在转储时,redis-dump-load 也会转储即将过期的键的 TTL 值以及计算出的键将过期的时间(expireat)。由于 Redis 不提供用于检索键绝对过期时间的命令,因此使用 客户端 系统上的当前时间来计算过期时间。因此,如果客户端系统的时间与 Redis 服务器运行的系统上的时间不一致,expireat 值将是不正确的。

在加载时,redis-dump-load 默认使用转储中的 TTL 值(ttl 键)来设置键的过期时间,而不是 expireat 值。这将保持键的相对过期时间,但会更改键的绝对过期时间。使用 -A/--use-expireat 命令行选项或 use_expireat 参数到模块函数将使 redis-dump-load 使用 expireat 值而不是 ttl 值,设置过期的键在转储之前相同的绝对时间过期(只要所有涉及的机器上的系统时间都同步)。

在 redis-dump-load 版本 1.0 中增加了 TTL 值和过期时间的转储和加载。

Unicode

Redis 在字节上操作,没有 Unicode 或编码的概念。JSON 在(Unicode)字符串上操作,不能序列化二进制数据。因此,redis-dump-load 必须在将数据加载到 Redis 时将 Unicode 字符串编码为字节字符串,并在从 Redis 转储数据时将字节字符串解码为 Unicode 字符串。默认情况下,redis-dump-load 使用 utf-8 对发送到 Redis 的数据进行编码,并对从 Redis 接收到的数据进行解码。此行为与 redis-py 相匹配,其默认编码也是 utf-8。可以指定不同的编码。

dumps 返回字符串,即在 Python 2 上的 str 实例和在 Python 3 上的 unicode 实例。

当使用 dump 将数据转储到 IO 对象时,如果 IO 对象接受字节字符串(例如,当以二进制模式打开文件时),redis-dump-load 将使用当前生效的默认编码对转储数据进行 .encode()

ijson 的 yajl2 后端只能解码 bytes 实例,而不是 str。当以文本模式打开文件并使用 ijson-yajl2 加载数据时,redis-dump-load 将使用 utf-8 编码将文件数据编码后传递给 ijson。如果失败,请尝试以二进制模式打开文件/流。

jsaone 只能解码文本字符串(str 实例),不能解码 bytes。当以二进制模式打开文件并使用 jsaone 加载数据时,redis-dump-load 将使用默认编码解码文件数据。如果失败,您可以更改默认编码或在 open() 调用中适当指定编码以以文本模式打开文件。

并发修改

redis-dump-load 不会锁定它正在转储的整个数据集,因为 Redis 不提供这样的方式。因此,在转储进行中进行的对数据集的修改会影响转储的内容。

依赖关系

测试

redis-dump-load 有一个测试套件。要运行它,安装 nose 并运行

nosetests

有几个测试用于检查竞争条件,因此运行时间较长。要跳过它们,可以按如下方式调用 nose

nosetests -a '!slow'

许可

根据 2 条款 BSD 许可证发布。

项目详情


下载文件

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

源分发

redis-dump-load-1.1.tar.gz (9.8 kB 查看哈希值

上传时间

支持者

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