使用Redis和Sinatra为Facebook应用程序进行地理空间索引

ma1*_*w28 3 indexing geolocation geospatial sunspot redis

我正在与Sinatra和Redis 在Facebook上重建恋人,我想要:

  • 设置用于管理用户之间的请求和关系的操作
  • 地理空间索引以显示附近的应用用户

当前的Redis实施

每个用户都有两个Redis有序集(reqSent&reqRecv),用于存储uid.在SCORE我们为了通过请求是time(UNIX时间戳)提出请求.我使用有序集而不是列表,因为用户可能只将请求类型(rid)编码为数字并添加到uid之前.(rid | uid)例如,对于uid = 100的用户,我们可能会:

100:reqSent => ["1|123", "2|123", "2|134"]  # format: ["rid|tid"]
100:reqRecv => ["3|343", "5|142", "4|2224"] # format: ["rid|uid"]
Run Code Online (Sandbox Code Playgroud)

MongoDB原生支持地理空间索引,所以我想改用它.

否则,我应该如何使用Redis实现地理空间索引?我应该用太阳黑子(localsolr)吗?显然,你可以使用Redis的太阳黑子.

Tom*_*son 6

我喜欢避免多个平台,并使用redis实现了类似的功能.地理空间索引与在redis中索引其他任何东西并没有什么不同.您只需要一个函数将lat/long转换为覆盖适当区域的单个数字,然后使用数字作为包含该区域中所有用户的集合的键.如果您选择了右侧区域,则检索该组以及可能的某些邻居应该为您提供适当数量的用户来运行实际距离计算以进行最终过滤/排序.

地理空间查询的一般情况很难实现,但您不需要它,而redis无论如何都是错误的ad hoc查询平台.

  • 该函数既简单又随意 - (lat + 90)*180 + long将为1度内的所有内容提供单个数字,并且您可以通过添加一些常量来获得所需的任何精度.如果选择精度权限,则性能不是问题 - 初始查询会为您提供一些合理的记录,以便运行完整计算. (4认同)