我正在學習Redis,並正在爲學習目的構建地理程序。我只想使用Redis來存儲數據,並試圖避免任何關係數據庫。我的問題是如何最好地爲程序設計數據庫。這就是程序如何去做的:使用Redis的地理程序設計建議
1)我將在世界各地創建數百萬隨機機器人,它們可以有不同的地理座標(有些機器人可以在完全相同的空間中)。
2)每個機器人將隨機發送一個帖子到服務器(可能平均每隔幾個小時),它將包含:a)機器人發送數據的位置(座標或geohash取決於最好的實現思路) 二)一些小的文本
3)我將與所有機器人的地圖,並希望能夠點擊一個機器人,並得到這個信息: 一)所有的職位它被張貼我剛剛點擊的機器人附近
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).
2)然後,我將能夠得到所有的通過發送他所在的geohash位置來發布機器人附近的帖子。這裏的失敗是我還需要包括他的8個geohash鄰居,這需要8個以上的查詢。這就是爲什麼我也在研究這個特徵的空間鄰近概念。
HGETALL [GeoHash Location of robot]
這會返回字段([timestamp])和值(「0」);
3)舊帖子到期。由於我無法使用EXPIRE命令從哈希集中刪除字段,因此我需要定期掃描所有哈希集字段並查找舊時間戳並將其刪除。由於Redis只允許模式搜索,所以當所有時間戳不同時,這可能會很困難。
理念2:
使用Redis的-地理位置(https://matt.sh/redis-geo)。
1)保存的帖子我會跑:
geoadd globalSet [posts_long] [posts_lat] "small text";
2)爲了讓所有的職位信息,附近的機器人:
georadius globalSet [robots_long] [robots_lat] [X] km
這將內歸還所有帖子機器人附近的X公里。
3)然後我現在卡住瞭如何刪除舊帖子
感謝您的答覆!我不明白如何檢索密鑰。使用類似GeoLocation的東西:(特定機器人的位置):*我不需要使用SCAN命令來模式匹配?如果不是這個命令O(N)那麼我不需要掃描Redis中的所有密鑰? – user2924127
讓我給你一個在java(jedis)的想法 設置 keys = jedis。鍵(「GeoLocation:」+(機器人的位置)+「*」); 這將返回與特定機器人匹配的所有密鑰。 然後通過該設置來獲取您需要的帖子和TimeStamp。 這將是O(M)而不是O(N)。因爲我們只是循環與特定機器人相匹配的按鍵。 因此,你會收到特定機器人的所有帖子。 –
目的是嘗試獲取由機器人位置附近的其他機器人制作的所有帖子,而不是由特定機器人制作的帖子。 – user2924127