使用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左右的记录数量?
(不考虑热备份)