Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures Redis GEORADIUS具有一个Z集,而具有许多特定大小的Z集_Data Structures_Redis_Gps_Geospatial - Fatal编程技术网

Data structures Redis GEORADIUS具有一个Z集,而具有许多特定大小的Z集

Data structures Redis GEORADIUS具有一个Z集,而具有许多特定大小的Z集,data-structures,redis,gps,geospatial,Data Structures,Redis,Gps,Geospatial,什么会更快,一个有地理数据的大ZSET,我将用GEORADIUS查询100米半径 或 很多ZSET,每个ZSET负责覆盖全世界的100m X 100m平方米?以这100万平方米命名,如: 左转弯1_49_2440000_28_5010000 左转弯2_49_2450000_28_5010000 把所有的100米都放在布景的右边和底部。 因此,当搜索最近的点时,我将省略gps中的冗余数字,例如:49.2440408,28.5011694将变为 49.2440000,28.5010000这样我就知

什么会更快,一个有地理数据的大ZSET,我将用GEORADIUS查询100米半径

很多ZSET,每个ZSET负责覆盖全世界的100m X 100m平方米?以这100万平方米命名,如:

左转弯1_49_2440000_28_5010000

左转弯2_49_2450000_28_5010000

把所有的100米都放在布景的右边和底部。 因此,当搜索最近的点时,我将省略gps中的冗余数字,例如:49.2440408,28.5011694将变为 49.2440000,28.5010000这样我就知道了ZSET的名字,在那里可以得到100米精度的所有精确值


或者以一般形式提出疑问:如何在redis中存储和访问ZSET的名称?如果我有太多的zset,它会影响访问它们时的性能吗?

只能通过基准测试对这种方法进行精确比较,这将特定于您的数据集和配置。但从架构上讲,您的优点和缺点是:

  • 大ZSET:执行的带宽和操作(CPU周期)更少,边界上没有问题(可能与多个ZSET重复),可以通过分片获得吞吐量
  • 许多ZSET:减少其他操作的延迟(当大ZSET运行时,其他命令正在等待),可以通过分片获得吞吐量,通过集群获得延迟
至于底线问题,我并没有看到实现代码,但集合名称应该和您使用的任何其他键相同。这是关于键数的说明:

一个Redis实例最多可以保存多少个密钥

Redis最多可以处理2^32个键,并且在实践中经过测试可以处理 每个实例至少有2.5亿个密钥

更新:

看看Redis文档对Georgadius的评价:

时间复杂度:O(N+log(M)),其中N是内部元素的数量 由圆心和半径分隔的圆形区域的边界框 M是索引中的项数


这意味着查询之外的项会对查询产生O(log(M))影响。因此,1000万件商品17跳,或者1b件商品21跳,这是相当便宜的。剩下的问题是,您会在节点之间进行分区吗?

为什么不对其进行基准测试并找出答案?支持更复杂的多zset方法的一点是,它能够通过使用分片/集群环境对其进行某种程度的并行化。@Midnight Guest我已经更新了答案,应该足以做出决定了