用Redis GEOADD存储JSON成员是不好的做法吗?

时间:2019-01-09 19:48:02

标签: laravel redis

我的应用程序应该处理许多具有位置的实体(100.000或更多),并且只需要在给定半径内显示它们。我基本上将所有内容存储在SQL中,但使用Redis进行缓存和优化(主要是GEORADIUS)。

我要像下面的示例一样添加实体(不完全是这样,我将Laravel框架与内置的Redis外观一起使用,但其与后台的功能相同):

await

这是不好的做法吗?还是会对性能产生负面影响?我是否应该仅将ID-作为成员存储,并进行以下查询以获取相应的实体?

1 个答案:

答案 0 :(得分:0)

这是要求的问题。只要原始数据是唯一的(并在给定“ id”字段的情况下是唯一的),将数据存储为成员就没有错。实际上,这既简单又高效,因为所有数据都通过一个查询返回(假设这实际上是需要的)。

也就是说,将数据存储在Geoset之外至少有两个注意事项,只是通过让成员反映其键名的某种形式来“引用”该数据:

  1. 单个数据结构(例如Geoset)受单个Redis服务器资源的限制。存储大量数据和成员可能需要比单个服务器所能提供的更多的内存,这将限制此方法的可扩展性。

  2. 除非每个条目的数据很小,否则所有查询类型都不太需要返回所有数据。在这种情况下,将原始数据保存在Geoset中会浪费大量带宽,并最终降低性能。

  3. 当需要更新数据时,尝试更新(即ZDEL,然后GEOADD)的一小部分会变得太昂贵。然后,将所有内容都放在外面(也许放在哈希中(或类似ReJSON之类的东西))就更有意义了。