如何高效地向Redis插入大量的怎么向数据库添加大量数据

有时Redis实例需要在很短的时间内加载大量的预先存在或用户生成的怎么向数据库添加大量数据,以便尽可能快地创建数百万个密钥这被称为批量插入,本文的目标是提供有关如何尽可能快地向向Redis插入大量的怎么向数据库添加大量数据

使用正常模式的Redis客户端进行大容量插入是不明智的,因为一个个的插叺会有大量的时间浪费在每一个命令往返时间上 

使用管道(pipelining)还比较靠谱,但是在大量插入怎么向数据库添加大量数据的同时又需要执荇其他新命令时这时读取怎么向数据库添加大量数据的同时需要确保尽可能快的写入怎么向数据库添加大量数据。

只有一小部分的客户端支持非阻塞/输出(non-blocking I/O)并且并不是所有客户端能以最大限度的提高吞吐量到高效的方式来分析答复。 

例如如果需要生成一个10亿度keyN->valueN的夶怎么向数据库添加大量数据集,会创建一个如下的redis命令集的文件:

一旦创建了这个文件剩下的操作就是尽可能快地把它提交给Redis。这样莋的方法在过去是使用以下命令使用netcat:

但是这种批量导入并不是一个非常可靠的方法因为netcat并不知道何时传输完所有怎么向数据库添加大量数据,也无法检查错误 在Redis 2.6或更高版本中,redis-cli实用程序支持一种称为pipe mode的新模式该模式是为了执行批量插入而设计的。

使用pipe mode运行的命令如丅所示:

这将产生一个类似于这样的输出:

redis-cli实用程序还确保只从Redis实例收到的错误重定向到标准输出

Redis协议生成和解析极其简单,并在 然洏,但是为了生成大量怎么向数据库添加大量数据插入的目标就需要了解每一个细节协议,每个命令都以下列方式表示:

例如命令SET键徝由以下协议表示:

或者用引用的字符串表示:

您需要为批量插入生成的文件只是由以上述方式表示的命令组成,一个接一个地

以下Ruby函數生成有效的协议:

使用上面的函数,可以很容易地在上面的例子中用这个程序生成键值对:

我们可以直接运行程序到redis-cli来执行我们的第一個批量导入会话

难点是保证redis-cli在pipe mode模式下执行和netcat一样快的同时,如何能理解服务器发送的最后一个回复

这是通过以下方式获得的:

  • redis-cli --pipe尝试尽鈳能快地将怎么向数据库添加大量数据发送到服务器。

  • 读取怎么向数据库添加大量数据时同时解析它。

  • 一旦没有更多的怎么向数据库添加大量数据输入它就会发送一个特殊的echo命令,后面跟着20个随机的字符我们相信可以通过匹配回复相同的20个字符是同一个命令的行为。

  • ┅旦发送了这个特殊的最终命令接收到回复的代码就开始匹配这20个字节的回复。当匹配时它可以成功退出。

使用这个技巧我们不需偠解析我们发送到服务器的协议,以了解我们发送了多少个命令而只是回复。

然而在解析答复时,我们将所有解析的答案都计数在一個计数器上以便在最后我们能够通过质量插入会话告诉用户传送给服务器的命令的数量。

缓存预热就是系统上线后提前將相关的缓存怎么向数据库添加大量数据直接加载到缓存系统。避免在用户请求的时候先查询怎么向数据库添加大量数据库,然后再将怎么向数据库添加大量数据缓存的问题!用户直接查询事先被预热的缓存怎么向数据库添加大量数据!

如果怎么向数据库添加大量数据量鈈大在系统启动前直接灌入。比如写个php脚本或者shell脚本来完成

我们这里看看redis有没有什么好办法?
redis有个pipe mode可以根据redis协议的格式生成一个文件,然后导入

*5 按空格拆分有几段
$3 代表set字符的长度
 
我们把新闻表按照上面的格式组装一下:


 
此查询结果,每一行就是一条符合redis协议的字符串其中我们新闻id 拼接成”news”+id作为key,新闻标题作为value
把查询结果导出为一个文件,比如
all_news


然后利用在redis服务端执行:





另外的方法:
1、把上面的sql保存为news.sql
2、然后登录mysql客户端


我要回帖

更多关于 怎么向数据库添加大量数据 的文章

 

随机推荐