数据库设计 – 使用Redis的地理程序设计建议

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

1)我将在世界各地创造数百万个随机机器人,这些机器人漫游,所以他们可以有不同的地理坐标(一些机器人可以在完全相同的空间).

2)每个机器人将随机发送一个邮件到服务器(平均每几个小时),其中包含:
    a)机器人发送这些数据的位置(根据最佳实现想法,在任一坐标或geohash中)
    b)一些小文字

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

4)由于我将在AWS上托管这一事实,因此我需要每隔几个小时删除一次帖子以保持内存使用量低,所以某些类型的到期是强制性的.

我的主要关注点是性能,我对如何设计Redis数据库感兴趣.

在一天的时间里,我将会随机提供数学随机的数据,大概会产生约5亿个帖子.

我迄今未完成的想法:

想法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).

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

HGETALL [GeoHash Location of robot] 

这将返回字段([timestamp])和值(“0”);

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

想法2:

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

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

geoadd globalSet [posts_long] [posts_lat] "small text";

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

georadius globalSet [robots_long] [robots_lat] [X] km

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

3)然后我现在被困在如何删除旧帖子

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

而不是在hash中存储值,只需将所有内容存储在redis中.
构造密钥作为GeoLocation:[机器人的Geohash位置]:1 [指示帖子的数量,每当新的请求到达时,它将继续递增]:时间戳和值将是时间戳.
同样对于小文本GeoLocation:[Geohash位置的机器人]:1 [表示帖子的数量]:smallText.
使用set expire设置值,并根据您的需要设置过期时间.

例如:setex GeoLocation:12.31939:1:timestamp 1432423232(timestamp)14400(4 hrs)
    setex GeoLocation:12.31939:1:smalltext ronaldo 14400

因此,您将获得来自所有机器人的任何数量的帖子,具有不同的键,访问和设置过期也变得容易.

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

以这种方式,您不需要扫描redis中的所有键.你会得到相对较快的信息,钥匙已经过期了.

翻译自:https://stackoverflow.com/questions/29979085/geo-program-design-suggestions-using-redis

转载注明原文:数据库设计 – 使用Redis的地理程序设计建议