处理大量数据时的Redis的助手们:①PostgreSQL的外部数据包装器

首先

在处理业务数据、日志甚至是流数据等大量数据时,有时会使用Redis进行处理。

就我的情况而言,我处理的数据有数亿行✕数种类,以及数千万行✕数百种类。对于Redis来说,如果数据量在数千万行以下,可以使用哈希(HSET、HMSET)来加速访问,而且速度还相当快。但当数据量达到数亿行之后,响应速度和RAM容量就变得非常重要了(因此,有时需要对数据库进行分割,但这可能会引起混乱…)。

旨在这里,我们将把关于将大量数据存入Redis并进行搜索的工作的效率化和加速化技巧作为备忘录进行总结。
计划涉及:
· 使用PostgreSQL的redisFDW(将redis数据作为SQL表处理)=> 这次
· Vedis(去除网络层的redis轻量级键值存储)
· rediSQL(提供完全功能的SQL数据库的Redis模块)

这样看来。

Redis的使用场景

Redis这个数据库因其实时排名功能而闻名,该功能是通过使用有序集合(sorted set)实现的(例如这里)。以下将介绍除了实时排名之外的其他用法。

① 批处理:通过管道输入数据

将数据高速接收是redis的特长。
例如,创建一个包含redis命令的文本。

 HSET mytable data1 123
 HSET mytable data2 456
 HSET mytable data3 789
 ... 延々と続く ...

我们可以使用客户端(redis-cli)的管道模式来批量输入数据。

将mydata.txt文件的内容输入到redis-cli工具中进行批处理。

请注意,某些情况下,如果不在行的开头插入半角空格,数据可能无法正确输入(就像我平常使用的环境一样)。

请参考Redis官方文档中日文翻译的“大量数据插入”部分。

② 流式处理:排队

在 Redis 中,有一种称为“列表”的机制,非常方便用于排队的 push/pop 操作。
目前还没有进行流处理的实验,但似乎可以与 Spark Streaming 和 Apache Flink 结合使用。
关于排队方面,以下资料整理得比较详细(总结在第33页和40页)。
选择用于支持流处理的排队系统的方法。

听说对于那些注重性能的使用情况来说,专注于队列的Apache Kafka是一个不错的选择,但至少现在有了使用Redis的选择,这令人高兴。

用Postgres来处理Redis散列的示例

使用PostgreSQL的Redis外部数据封装器(FDW)最令人高兴的是能够通过SQL查询对Redis的哈希进行操作。这种访问是通过最近添加到PostgreSQL的键-值存储hstore来完成的。因此,首先需要通过psql连接到PostgreSQL,并生成redis_fdw扩展以及hstore扩展。

CREATE EXTENSION redis_fdw;
CREATE EXTENSION hstore;

参考该链接以完成 Redis_fdw 的安装和初始设置。

如果注册了一个具有以person开头的键的哈希表,类似以下的情况,只需要一个选项:

HMSET person:id100 name Nicolson age 55

准备一个与PostgreSQL匹配的表redisPerson。

CREATE FOREIGN TABLE
 redisPerson (key text, value text[])
 SERVER redis_server 
 OPTIONS (database '0', tabletype 'hash', tablekeyprefix 'person:')
;

可以通过以下查询将年龄在50岁及以上的人筛选出来。

select * from
 (select key,hstore(value) as value from redisPerson) as X
  where cast(value->'age' as numeric) > 50
;

结果 (jié guǒ)

keyvalueperson:id100″age”=>”55″, “name”=>”Nicolson”

对于擅长SQL的人来说,只需掌握PostgreSQL方言的hstore,即可充分利用这些知识,因此我认为它是最简单的挖掘redis埋没数据的方法。我不愿意申请超级用户权限以使用redis_fdw,在工作中尚未使用。以下是我在尝试时的屏幕截图。

スクリーンショット 2017-09-17 21.58.51.png
スクリーンショット 2017-09-18 10.40.11.png

(参考)进行redis_fdw的安装记录

需要同时安装Redis的C客户端库和redis-fdw。
这些安装步骤取决于PostgreSQL的版本和安装情况。
必要条件可能如下所示:

事先设置psql路径
安装postgresql-server-dev
引入与PostgreSQL版本匹配的redis_fdw分支

如果将PostgreSQL 9.6安装在Ubuntu(Cloud9)上,

PATH=/usr/usr/share/postgresql-common/:$PATH #最近のpostgresの場合
sudo apt-get install postgresql-server-dev-9.6
git checkout -b REL9_6_STABLE origin/REL9_6_STABLE

到达这里之前,需要进行一些试验和错误。
即使查看网上的部署指南,大家也都在各自的环境中试验和错误地进行部署。

我认为使用Docker来安装用于Redis数据分析的PostgreSQL是很简单的。(将Redis数据移动为RDB文件也很简单)我在Docker中使用PostgreSQL的FDW与MySQL和Redis进行了JOIN操作的尝试。

虽然无关紧要,但是Cloud9可以用于Docker环境,如果你同时使用两者,可能将来在团队开发中会变得更方便(对未来的自己来说)。

广告
将在 10 秒后关闭
bannerAds