使用Redis的地理程序设计建议

use*_*127 17 database-design geolocation geospatial nosql redis

我正在学习Redis,正在构建一个用于学习目的的地理计划.我想只使用Redis存储数据,并试图避免任何关系数据库.我的问题是如何最好地为该程序设计数据库.这就是程序的方式:

1)我将在世界各地创造数以百万计的随机机器人,这些机器人可以徘徊,因此它们可以有不同的地理坐标(一些机器人可以在完全相同的空间内).

2)每个机器人将随机发送一个帖子到服务器(平均每隔几个小时),其中包含:a)机器人从哪里发送这些数据的位置(根据最佳实施思路,在坐标或geohash中)b )一些小文字

3)我将拥有一张包含所有机器人的地图,并希望能够点击机器人并获取此信息:a)我刚刚点击机器人附近发布的所有帖子

4)由于我将在AWS上托管此事件,我将需要每隔几小时删除一次帖子以保持较低的内存使用率,因此某些类型的过期是必需的.

我主要担心的是性能,我对如何设计Redis数据库很感兴趣.

在一天之内(我将计算随机帖子的数学)这将产生大约500,000,000个帖子.

到目前为止我的不完整的想法:

想法1

1)帖子将被存储为:

`HSET [Geohash of location] [timestamp] [small text] (<-- the value will be used in a later feature to increment the number of manual modification I make to a post).
Run Code Online (Sandbox Code Playgroud)

2)然后,我可以通过发送他所在的geohash位置获得机器人附近的所有帖子.这里的垮台是我还需要包括他的8个geohash邻居,这将需要8个以上的查询.这就是为什么我也在研究这个特征的空间接近度的概念.

HGETALL [GeoHash Location of robot] 
Run Code Online (Sandbox Code Playgroud)

然后,这将返回字段([timestamp])和值("0");

3)旧帖子到期.由于我无法使用EXPIRE命令从哈希集中删除字段,因此我需要定期扫描所有哈希集字段并查找旧时间戳并将其删除.由于Redis只允许模式搜索,因此当所有时间戳不同时,这可能会很困难.

想法2:

使用Redis-geo(https://matt.sh/redis-geo).

1)要存储我将运行的帖子:

geoadd globalSet [posts_long] [posts_lat] "small text";
Run Code Online (Sandbox Code Playgroud)

2)获取附近机器人的所有发布信息:

georadius globalSet [robots_long] [robots_lat] [X] km
Run Code Online (Sandbox Code Playgroud)

这将返回X kms内机器人附近的所有帖子.

3)然后我现在卡住了如何删除旧帖子

Kar*_*all 0

让我根据我如何理解你的问题给你一个想法:

无需将值存储在哈希中,而是将所有内容存储在 Redis 中。将 key 构造为 GeoLocation:[机器人的 Geohash 位置]:1[表示发布的数量,每当有新请求到来时都会不断增加]:timestamp,值将是时间戳。同样对于小文本 GeoLocation:[机器人的 Geohash 位置]:1[表示帖子数量]:smallText。使用 set expire 来设置值并根据您的意愿设置过期时间。

例如:setex GeoLocation:12.31939:1:时间戳 1432423232(时间戳)14400(4 小时)setex GeoLocation:12.31939:1:smalltext 罗纳尔多 14400

因此,您将获得来自所有机器人的任意数量的帖子,并具有独特的访问密钥,并且设置过期也变得容易。

现在要获取特定机器人发布的所有信息,请使用键 GeoLocation:(特定机器人的位置):* 并获取每个值。

这样就不需要扫描redis中的所有key了。您将相对更快地获得信息,并且密钥会自行过期。