我有一个看起来像这样的集合(除了它有大约8000个项目):
{"id":563244,"stock_id":693,"value":"9.17","symbol":"BCS"}
{"id":565527,"stock_id":10093,"value":"21.09","symbol":"GDXS"}
{"id":564311,"stock_id":4241,"value":"91.52","symbol":"NDAQ"}
{"id":565269,"stock_id":8883,"value":"127.60","symbol":"SAA"}
我需要能够按值范围过滤这些值,例如,我可以说“给我所有值在5.50和24.36之间的条目”或“给我所有值在47.45和301.8之间的条目”。可以传递给此过滤器的数字没有限制。
现在,我知道可以为每个值创建一个集合,但是我认为这样做效率不高,因为大约8000个条目中的几乎所有都有唯一值。
如果我们可以预定义范围(例如0-10、10-20等),那么我可以为每个范围创建集合,其中包含属于该范围的键。但是,事实并非如此,我需要在保持性能稳定的同时尽可能地灵活。
我意识到使用键值存储可能会很棘手,但是也许有人可以解决?
答案 0 :(得分:1)
如果您愿意进行其他收集,则可以使用排序集(ZSET),将值作为分数,将条目本身作为成员,如下所示:
127.0.0.1:6379> ZADD stocks 9.17 '{"id":563244,"stock_id":693,"value":"9.17","symbol":"BCS"}'
(integer) 1
127.0.0.1:6379> ZADD stocks 21.09 '{"id":565527,"stock_id":10093,"value":"21.09","symbol":"GDXS"}' 91.52 '{"id":564311,"stock_id":4241,"value":"91.52","symbol":"NDAQ"}' 127.60 '{"id":565269,"stock_id":8883,"value":"127.60","symbol":"SAA"}'
(integer) 3
然后仅拉那些只有您需要的分数的成员:
127.0.0.1:6379> ZRANGEBYSCORE stocks 20 100
1) "{\"id\":565527,\"stock_id\":10093,\"value\":\"21.09\",\"symbol\":\"GDXS\"}"
2) "{\"id\":564311,\"stock_id\":4241,\"value\":\"91.52\",\"symbol\":\"NDAQ\"}"