3

我正在使用 Sinatra 和 Redis在 Facebook 上重建 Lovers ,我想要:

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

当前的 Redis 实现

每个用户都有两个存储 uid 的 Redis 有序集 ( reqSent& reqRecv)。SCORE我们订购请求的依据是发出请求的(timeUNIX 时间戳)。我使用的是有序集合而不是列表,因为用户只能将请求类型 (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本身支持地理空间索引,所以我正在考虑切换到它。

否则,我应该如何使用 Redis 实现地理空间索引?我应该用Sunspot (localsolr) 来做吗?显然,您可以将Sunspot 与 Redis 一起使用。

4

2 回答 2

7

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

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

于 2011-01-10T02:15:03.157 回答
4

如果您认为 MongoDB 是一个有效的选择,那么在 Redis 中实现地理空间索引听起来非常耗时。Mongo 速度很快,而且很好用。如果大多数查询将针对地理空间索引,那么我认为没有理由不使用 Mongo。

我经常发现自己在同一个项目中同时使用 Mongo 和 Redis。它们都有非常有用的属性,有些用例在 Mongo 中运行良好,有些在 Redis 中运行良好。然而,反过来也是正确的,有些事情在 Redis 中确实非常难以做到,而其他事情在 Mongo 中实际上是不可能的。地理空间索引是前者的一个例子,而集合操作是后者的一个例子。

另外,在不太了解 Sunspot 的情况下,它真的会使用 Redis 吗?它不使用使用文件系统进行存储的 Solr 吗?在我看来,你不能在其中安装 Redis,除非我完全错了,否则我会说你绝对应该使用 MongoDB。

于 2011-01-09T07:53:51.000 回答