У меня есть набор, похожий на этот (за исключением того, что в нем около 8000 предметов):
{"id":563244,"stock_id":693,"value":"9.17","span_minutes":1440,"symbol":"BCS"}
{"id":565527,"stock_id":10093,"value":"21.09","span_minutes":2880,"symbol":"GDXS"}
{"id":564311,"stock_id":4241,"value":"91.52","span_minutes":7200,"symbol":"NDAQ"}
{"id":565269,"stock_id":8883,"value":"127.60","span_minutes":5760,"symbol":"SAA"}
Теперь я хочу получить записи с:
Я могу получить их, сначала создав 2 новых отсортированных набора, а затем используя zrangebyscore
, чтобы извлечь нужные записи:
ZADD values 9.17 '{"id":563244,"stock_id":693,"value":"9.17","symbol":"BCS"}'
ZADD values 21.09 {"id":565527,"stock_id":10093,"value":"21.09","span_minutes":2880,"symbol":"GDXS"}
ZADD values 91.52 {"id":564311,"stock_id":4241,"value":"91.52","span_minutes":7200,"symbol":"NDAQ"}
ZADD values 127.60 {"id":565269,"stock_id":8883,"value":"127.60","span_minutes":5760,"symbol":"SAA"}
ZADD spans 1440 '{"id":563244,"stock_id":693,"value":"9.17","symbol":"BCS"}'
ZADD spans 2880 {"id":565527,"stock_id":10093,"value":"21.09","span_minutes":2880,"symbol":"GDXS"}
ZADD spans 7200 {"id":564311,"stock_id":4241,"value":"91.52","span_minutes":7200,"symbol":"NDAQ"}
ZADD spans 5760 {"id":565269,"stock_id":8883,"value":"127.60","span_minutes":5760,"symbol":"SAA"}
Теперь, если я хочу отфильтровать эти наборы, чтобы получить нужные значения, я могу сделать это:
$value_range = Redis::zrangebyscore('values',20,100);
$span_range = Redis::zrangebyscore('spans',5000,8000);
Эти возвращаемые значения соответственно:
1) {"id":565527,"stock_id":10093,"value":"21.09","span_minutes":2880,"symbol":"GDXS"}
2) {"id":564311,"stock_id":4241,"value":"91.52","span_minutes":7200,"symbol":"NDAQ"}
и
1) {"id":565269,"stock_id":8883,"value":"127.60","span_minutes":5760,"symbol":"SAA"}
2) {"id":564311,"stock_id":4241,"value":"91.52","span_minutes":7200,"symbol":"NDAQ"}
Теперь мне нужен способ объединить эти два набора. Из того, что я вижу в документации по Redis, я должен иметь возможность использовать zinterstore для этой цели, но я не понимаю синтаксис, и все, что я пытаюсь сделать, либо выдает ошибку, либо возвращает целое число 0. Например:
Redis::zinterstore('intersection', 2, $value_range, $span_range);
возвращает ошибку.
$intereseciton = Redis::zinterstore(2, $value_range, $span_range);
возвращает 0.
Что я должен получить:
1) {"id":564311,"stock_id":4241,"value":"91.52","span_minutes":7200,"symbol":"NDAQ"}
потому что это единственный элемент исходного набора, который соответствует обоим моим условиям.
Возможно, у меня неправильный синтаксис или вообще неправильный подход. Как эффективно получить пересечение двух отсортированных наборов?