处理大量数据时的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ǒ)
对于擅长SQL的人来说,只需掌握PostgreSQL方言的hstore,即可充分利用这些知识,因此我认为它是最简单的挖掘redis埋没数据的方法。我不愿意申请超级用户权限以使用redis_fdw,在工作中尚未使用。以下是我在尝试时的屏幕截图。
(参考)进行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环境,如果你同时使用两者,可能将来在团队开发中会变得更方便(对未来的自己来说)。