1)我将在世界各地创造数百万个随机机器人,这些机器人漫游,所以他们可以有不同的地理坐标(一些机器人可以在完全相同的空间).
2)每个机器人将随机发送一个邮件到服务器(平均每几个小时),其中包含:
a)机器人发送这些数据的位置(根据最佳实现想法,在任一坐标或geohash中)
b)一些小文字
3)我将拥有所有机器人的地图,并希望能够点击机器人并获取此信息:
a)我刚刚点击的机器人附近张贴的所有帖子
4)由于我将在AWS上托管这一事实,因此我需要每隔几个小时删除一次帖子以保持内存使用量低,所以某些类型的到期是强制性的.
在一天的时间里,我将会随机提供数学随机的数据,大概会产生约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中的所有键.你会得到相对较快的信息,钥匙已经过期了.