Redis3官方文档(10)
——集中插入
有时候Redis实例需要在短时间内加载大量的已存在数据,或者用户产生的数据,这样,上百万的键将在很短的时间内被创建。
这被称为集中插入(mass insertion),这篇文档的目的,就是提供如何最快地向Redis中插入数据的一些相关信息。
使用协议,伙计
使用标准的Redis客户端来完成集中插入并不是一个好主意,理由是:一条一条的发送命令很慢,因为你需要为每个命令付出往返时间的花费。可以使用管道 (pipelining),但对于许多记录的集中插入而言,你在读取响应的同时还需要写新命令,以确保插入尽可能快。
只有少部分的客户端支持非阻塞I/O,也并不是所有的客户端都能高效地解析响应以最大化吞吐量。基于上述这些原因,首选的集中导入数据到Redis中的方式,是生成按照Redis协议的原始(raw)格式的文本文件,以调用需要的命令来插入需要的数据。
例如,如果我需要生成一个巨大的数据集,拥有数十亿形式为”keyN->ValueN”的键,我将创建一个按照Redis协议格式,包含如下命令的文件:
SET Key0 Value0
SET Key1 Value1
...
SET KeyN ValueN
当这个文件被创建后,剩下的工作就是将其尽可能快的导入到Redis中。过去的办法是使用netcat来完成,命令如下:
(cat data.txt; sleep 10) | nc localhost 6379 > /dev/null
然而,这种集中导入的方式并不是十分可靠,因为netcat并不知道所有的数据什么时候被传输完,并且不能检查错误。在github上一个不稳定的Redis分支上,redis-cli工具支持一种称为管道模式(pipe mode)的模式,设计用来执行集中插入。
使用管道模式运行命令如下:
cat data.txt | redis-cli --pipe
输出类似如下的内容:
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 1000000
redis-cli工具也能够确保仅仅将来自Redis实例的错误重定向到标准输出。
生成Redis协议(Generating Redis Protocol)
Redis协议非常容易生成和解析,可以参考其文档(请关注后续翻译文档,译者注)。但是,为了集中插入的目标而生成协议,你不必了解协议的每一个细节,仅仅需要知道每个命令通过如下方式来表示:
*<args><cr><lf>
$<len><cr><lf>
<arg0><cr><lf>
<arg1><cr><lf>
...
<argN><cr><lf>
<cr>表示"\r" (或ASCII字符13),<lf>表示"\n" (或者ASCII字符10)。
例如,命令SET key value通过以下协议来表示:
*3<cr><lf>
$3<cr><lf>
SET<cr><lf>
$3<cr><lf>
key<cr><lf>
$5<cr><lf>
value<cr><lf>
或者表示为一个字符串:
"*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n"
为集中插入而生成的文件,就是由一条一条按照上面的方式表示的命令组成的。
下面的Ruby函数生成合法的协议。
def gen_redis_proto(*cmd)
proto = ""
proto << "*"+cmd.length.to_s+"\r\n"
cmd.each{|arg|
proto << "$"+arg.to_s.bytesize.to_s+"\r\n"
proto << arg.to_s+"\r\n"
}
proto
end
puts gen_redis_proto("SET","mykey","Hello World!").inspect
使用上面的函数,可以很容易地生成上面例子中的键值对。程序如下:
(0...1000).each{|n|
STDOUT.write(gen_redis_proto("SET","Key#{n}","Value#{n}"))
}
我们现在可以直接以redis-cli的管道模式来运行这个程序,来执行我们的第一次集中导入会话。
$ ruby proto.rb | redis-cli --pipe
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 1000
管道模式如何工作(How works)
redis-cli管道模式的魔力,就是和netcat一样的快,并且能理解服务器同时返回的最后一条响应。
按照以下方式获得:
- redis-cli –pipe尝试尽可能快的发送数据到服务器。
- 与此同时读取可用数据,并尝试解析。
- 当标准输入没有数据可读时,发送一个带有20字节随机字符的特殊ECHO命令:我们确保这是最后发送的命令,我们也确保可以匹配响应的检查,如果我们收到了相同的20字节的批量回复(bulk reply)。
- 一旦这个特殊的最后命令被发送,收到响应的代码开始使用这20个字节来匹配响应。当匹配响应到达后成功退出。
使用这个技巧,我们不需要为了知道发送了多少命令而解析发送给服务端的协议,仅仅只需要知道响应就可以。
但是,在解析响应的时候,我们对所有已解析响应进行了计数,于是最后我们可以告诉用户,通过集中插入会话传输给服务器的命令的数。
===============================================================================
大家好,我是阮威。华中科技大学,计算机软件专业硕士。毕业后加入腾讯,先后在腾讯电子商务部和无线游戏产品部工作,现供职于欢聚时代基础产品部。IT男,至今。欢迎大家收听我的公众账号。
分享到:
相关推荐
2. **下载Redis源码包**:访问Redis官方网站下载最新稳定版源码包。 3. **解压缩并进入目录**:使用`tar`命令解压下载的文件,并进入解压后的目录。 4. **编译安装**: - 执行`make`命令进行编译; - 编译成功后,...
- **安装Redis**:可以通过官方文档获取安装指南,支持多种操作系统。 - **配置Redis**:主要包括调整服务器监听地址、端口号、密码认证等功能。 - **操作数据库**:学习如何使用Redis客户端工具进行基本的操作,如...
Redis 是一款高性能的键值存储系统,常用于缓存、分布式锁、消息队列等场景。Salvatore Sanfilippo,即 Redis 之父,宣布退出 Redis 的维护工作,但 Redis 的广泛应用并未因此受到影响,反而成为了面试中的必备知识...
### 架构师系列书籍——Redis实战:知识点详解 #### 一、Key-Value存储系统简介 ##### 1.1.1 Voldemort - **简介**:Voldemort是一款分布式Key-Value存储系统,由LinkedIn开发并开源。 - **特点**: - 支持分区和...
【Redis开发笔记——movement-mai】是一份关于Redis在处理移动数据或机器人轨迹跟踪方面的应用文档。Redis,全称为Remote Dictionary Server,是一个开源的、基于内存的数据结构存储系统,常被用作数据库、缓存和...
- **安装Redis**:下载Redis并按照官方文档进行安装,确保环境中已安装了必要的依赖。 - **配置Redis**:修改`redis.conf`文件中的参数,如绑定地址、端口等,以适应不同环境的需求。 - **操作数据库**:Redis支持多...
《PyPI官网下载 | dbcli_mongo_redis-0.3.5.tar.gz——探索Python数据库交互新维度》 在Python编程领域,PyPI(Python Package Index)是开发者们获取和分享开源软件包的重要平台。本资源,"dbcli_mongo_redis-...
《yaf手册——文档API(CHM+网页版)》 Yaf,全称为Yet Another Fast PHP Framework,是由中国著名开源社区PHPChina开发的一款轻量级的PHP框架,旨在提高PHP开发的效率和项目的可维护性。Yaf以其高效、简洁和易用性...
### Cachecloud文档解析 #### 一、概述 **Cachecloud** 是一款专为 Redis 集群管理和操作设计的开源工具。它通过提供一个统一的管理界面,简化了 Redis 实例的部署、监控以及维护过程。Cachecloud 支持多种 Redis ...
《激光磁盘:Fs2原生纯函数式Redis客户端的未来之选——laserdisc》 在现代软件开发中,Redis作为一个高性能的键值存储系统,广泛用于缓存、消息队列等多种场景。而Fs2,一个Scala中的流处理库,提供了一种强大的...
【标题】: "PHP实例开发源码——佰牛网络PHP企业网站管理系统(金黄色)" 是一个基于PHP编程语言的企业级网站管理系统源代码包。这个系统可能由佰牛网络开发,采用了金黄色作为主题色,旨在提供高效、稳定且易于定制的...
13.1.2 插入文档 219 13.1.3 查询集合 219 13.1.4 MongoDB数据库文件 220 13.2 Membase架构 222 13.3 Hypertable底层 224 13.3.1 正则表达式支持 224 13.3.2 布隆过滤器 224 13.4 Apache Cassandra 225 ...
在Java中处理WML,通常会用到WML解析库,比如KXML或者PullParser,来解析和生成WML文档。 在这个系统中,前端部分主要负责接收用户的查询请求,并使用WML展示查询结果。用户通过输入关键词或者选择预定义的查询条件...
文档可能包含SQL的基本语法,如SELECT查询、INSERT插入、UPDATE更新和DELETE删除语句,以及更复杂的JOIN操作、子查询和视图等。 4. **数据库设计**:良好的数据库设计至关重要。这可能涉及概念数据模型(如ER模型)...
1. **数据插入**:使用预处理语句防止SQL注入,提高安全性。 2. **数据检索**:通过SELECT语句获取种子信息,可以进行分页、排序等复杂查询。 3. **数据更新与删除**:当种子失效或者不再需要时,可以使用UPDATE和...
哈希表是一种高效的数据结构,它通过特定的函数——哈希函数,将任意大小的键(key)映射到一个固定大小的数组中,从而实现快速查找、插入和删除操作。在数据结构课程设计中,理解和掌握哈希表的设计与实现至关重要...
《深入浅出SpringBoot实战——基于javaStudy.rar的解析》 SpringBoot作为Java生态中的热门框架,因其简化配置、快速启动以及内置Tomcat等特性,深受开发者喜爱。本篇文章将围绕"javaStudy.rar"这个项目,详细解读...
HDFS 是一个分布式文件系统,用于存储文件,通过统一的命名空间——目录树来定位文件,并且是分布式的,由很多服务器联合起来实现其功能。HDFS 的重要特征包括: * 文件在物理上是分块存储(block),块的大小可以...