Intersecting redis sets that are incomplete -
i have data want store in redis able efficiently intersect it. example data:
key | members --------------------------------- 101 | "a1", "a2", "a3" 102 | "a2", "a3" 103 | "a2", "a4" so, intersection of keys give me
sinter 101 102 103 1) "a2" however, have problems when dataset incomplete:
key | members --------------------------------- 101 | "a1", "a2", "a3" 102 | "a2", "a3" 103 | "a4", "a5" in case, getting intersection of same 3 keys give me empty set:
sinter 101 102 103 (empty list or set) my goal member matches sets. there way in redis achieve this? alter way datasets stored, if helps. i.e. creating inverse versions of sets (members keys, keys members)
also, perhaps make sense use other key store redis, might more suitable task?
you can union operations on sorted sets, using aggregate sum argument. it's bit clunky work. add elements score of 1, , union summing scores.
the resulting set sorted element intersection points element least:
127.0.0.1:6379> zadd foo 1 (integer) 1 127.0.0.1:6379> zadd foo 1 b (integer) 1 127.0.0.1:6379> zadd foo 1 c (integer) 1 127.0.0.1:6379> zadd bar 1 (integer) 1 127.0.0.1:6379> zadd bar 1 c (integer) 1 127.0.0.1:6379> zadd baz 1 d (integer) 1 # let's union , store "merged" 127.0.0.1:6379> zunionstore merged 3 foo bar baz aggregate sum (integer) 4 # merged sorted common points 127.0.0.1:6379> zrevrange merged 0 -1 withscores 1) "c" 2) "2" 3) "a" 4) "2" 5) "d" 6) "1" 7) "b" 8) "1" 127.0.0.1:6379>
Comments
Post a Comment