2016年10月14日金曜日

redisのzset型で差集合演算を行いたい的なお話

  • このエントリーをはてなブックマークに追加

redisを使ってると便利なわけで。
特に用途として重要になってくるのが、set型やzset型の集合演算。

ただ面倒なことにzset型は差集合演算をすることができないけど
差集合は地味に必要となってくるので今日はそのお話をば。

// dst_zset
1.value1 100
2.value2 200
3.value3 300
4.value4 400
5.value5 500

// src_zset
1.value2 1
2.value4 4

redis:0>zunionstore new_zset 2 dst_zset src_zset weights 1 0 aggregate min

// new_zset
1.value1 100
2.value2 0
3.value3 300
4.value4 0
5.value5 500

redis:0>zremrangebyscore new_zset 0 0

// new_zset
1.value1 100
2.value3 300
3.value5 500

とりあえずdst_zsetにsrc_zsetを結合して差集合を取って、新しいzsetを作るっていうのはこんな感じになる。
dst_zsetに対してsrc_zsetを結合するんだけど、weightをdst_zset:src_zset = 1:0とすることで、
src_zsetに入っているものを0として加算し、aggregate minで低い方を採用する。
で、zremrangebyscoreでスコアが0のものを削除するっていう。

set型と違ってひと手間余計にかかるけど、これでzsetでも差集合が取れるのですごく役立つ。
どうしてzsetに差集合をそもそも搭載していないんだって思うけど、まぁ使い方次第でどうにかなるからどっちでもいいんだけど的なみたいな。

Adsense