导出和加载Redis数据库
项目描述
将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方法加载时使用的流式传输后端,如果已安装ijson或jsaone并且使用了流式传输
命令行使用
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。
如果已安装 ijson 或 jsaone,则 load 将会流式传输数据。要确定 redis-dump-load 是否支持流式数据加载,请检查 redisdl.have_streaming_load 变量。还存在 redisdl.have_ijson 和 redisdl.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。 - yajl2 与 ijson-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 不提供这样的方式。因此,在转储进行中进行的对数据集的修改会影响转储的内容。
依赖关系
simplejson(仅限 Python 2.5)
测试
redis-dump-load 有一个测试套件。要运行它,安装 nose 并运行
nosetests
有几个测试用于检查竞争条件,因此运行时间较长。要跳过它们,可以按如下方式调用 nose
nosetests -a '!slow'
许可
根据 2 条款 BSD 许可证发布。
项目详情
redis-dump-load-1.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | af4832c4db849fe060abb2053d1652b6cd91ea115058a98c8348af906fe5b6c9 |
|
MD5 | 967d0ce0812cb94f84777f133ffc1a52 |
|
BLAKE2b-256 | 7a6baca5babcdf62980a2bfae7430302e7e40610be7ff1abe7fa0214d2a0c2e5 |