我正在重建 Lovers on Facebook使用 Sinatra 和 Redis,我想要:
- 设置操作以管理用户之间的请求和关系
- 地理空间索引以显示附近的应用用户
当前的 Redis 实现
每个用户有两个存储 uid 的 Redis 有序集(reqSent
& reqRecv
)。我们对请求进行排序的 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"]
MongoDB supports geospatial indexing native ,所以我正在考虑切换到那个。
否则,我应该如何使用 Redis 实现地理空间索引?我应该用 Sunspot 来做吗? (本地解决方案)?显然,你可以使用 Sunspot with Redis .
最佳答案
我喜欢避免使用多个平台,并使用 redis 实现了类似的东西。地理空间索引与在 Redis 中索引任何其他内容并没有什么不同。您只需要一个函数将纬度/经度转换为覆盖适当区域的单个数字,然后使用数字作为包含该区域中所有用户的集合的键。如果您选择了正确的区域,检索该集合以及可能的它的一些邻居应该会让您获得适当数量的用户来运行实际距离计算以进行最终过滤/排序。
地理空间查询的一般情况很难实现,但您不需要它,而且 Redis 无论如何都不是临时查询的错误平台。
关于indexing - 使用 Redis 和 Sinatra 为 Facebook 应用程序建立地理空间索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4637031/