使用Redis的SET数据类型进行集合运算

数十万程度のユーザ集合に対するベン図を作成するためにA∩B∩C的なものの計算が必要になったため、勉強がてらredisを使ってみました。Pythonなどでのスクリプトは書かずにredis-cliで処理しています。

我发现关于Redis的SET类型的下面的解释很容易理解。

在NicoNico生放送上观看Redis的实际应用技巧
http://gihyo.jp/dev/feature/01/redis/0004

安装

按照这个链接(http://qiita.com/i2bskn/items/42cbf6bc52f9cfa406bb)的指示。

将原始数据进行批量导入

创建原始数据

参考链接:http://redis.io/topics/mass-insert

根据参考链接,我们需要创建以下数据。需要将换行符号改为CRLF。

$ head DataSet_A 
SADD A user0000000000000001
SADD A user0000000000000002
SADD A user0000000000000003
…
$ head DataSet_B
SADD B user0000000000000003
SADD B user0000000000000004
SADD B user0000000000000005
…
$ head DataSet_C 
SADD C user0000000000000001
SADD C user0000000000000003
SADD C user0000000000000007
…

进行加载

$ cat DataSet_A DataSet_B DataSet_C | time redis-cli --pipe
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 1700000

以中文本地化方式改写这句话,只需要一种选择:
在当前状态下,如果在 top 命令下确认,redis-server 的 VIRT 为653m,RES 为196m。

如果失败了,我会放弃。

$ redis-cli
127.0.0.1:6379> FLUSHALL
OK

进行集合运算

$ redis-cli
127.0.0.1:6379>

请参考 http://redis.io/commands#set

A的元素个数

> SCARD A

A的元素列表

> SMEMBERS A

A、B、C的交集列表

> SINTER A B C

A∩^B∩^C列表的翻译为:A交B交C列表

> SDIFF A B C

A∪B∪C列表可以被改写为:A、B和C的合并列表。

> SUNION A B C

A、B和C集合的元素总数

> SUNIONSTORE X A B C
> SCARD X A B C

感受

・在redis-cli中不能使用管道?
・考虑到RES在1,700,000条记录下为196m,那么简单地思考,用4GB内存可以处理30M左右的记录数量?
(不考虑热备份)

广告
将在 10 秒后关闭
bannerAds