Sono in procinto di apprendere Redis e sto creando un programma geografico per scopi di apprendimento. Vorrei utilizzare solo Redis per archiviare i dati e sto cercando di evitare qualsiasi database relazionale. La mia domanda è come progettare al meglio il database per il programma. Ecco come procede il programma:Suggerimenti per la progettazione di programmi geografici utilizzando Redis
1) Creerò milioni di robot casuali in tutto il mondo che vagano in modo che possano avere coordinate geografiche diverse (alcuni robot possono trovarsi nello stesso identico spazio).
2) Ogni robot invierà a caso un messaggio al server (con una media di poche ore) che conterrà: a) la posizione da cui il robot ha inviato questi dati (in coordinate o geohash a seconda del idea migliore implementazione) b) qualche piccolo testo
3) avrò una mappa con tutti i robot e vorrei essere in grado di fare clic su un robot e ottenere queste informazioni: a) tutti i messaggi che sono stati postato nelle vicinanze del robot ho appena cliccato
4) A causa del fatto che lo ospiterò su AWS dovrò eliminare i post ogni coppia e di ore per mantenere basso l'utilizzo della memoria, quindi è obbligatorio un certo tipo di scadenza.
La mia preoccupazione principale è la prestazione e sono interessato a come progettare il database Redis.
In un solo giorno (eseguirò i calcoli per post casuali per eseguire questa operazione) verranno generati circa 500.000.000 di post.
Le mie idee incomplete finora:
Idea 1
1) un post saranno memorizzati in quanto tale:
`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) Ho poi sarei in grado di ottenere tutte le posti vicino a un robot inviando la posizione geohash in cui si trova. La rovina qui è che avrei anche bisogno di includere i suoi 8 vicini geohash che richiederebbero altre 8 domande. Per questo motivo sto anche esaminando il concetto di prossimità spaziale per questa funzionalità.
HGETALL [GeoHash Location of robot]
Ciò restituirebbe quindi il campo ([timestamp]) e il valore ("0");
3) Scadenza di vecchi messaggi. Poiché non posso utilizzare il comando EXPIRE per eliminare campi da un hashset, dovrei quindi eseguire periodicamente la scansione di tutti i campi hashset e trovare vecchi timestamp e rimuoverli. Poiché Redis consente solo la ricerca di modelli, ciò potrebbe risultare difficile quando tutti i timestamp sono diversi.
Idea 2:
Uso Redis-geo (https://matt.sh/redis-geo).
1) Per memorizzare i messaggi vorrei correre:
geoadd globalSet [posts_long] [posts_lat] "small text";
2) per ottenere tutte le informazioni di posta di un robot vicina:
georadius globalSet [robots_long] [robots_lat] [X] km
Questa sarebbero tornati tutti i messaggi in prossimità del robot all'interno X km.
3) allora io sono ora bloccati come rimuovere vecchi post
Grazie per la risposta! Non capisco però come recuperare le chiavi. Per usare qualcosa come GeoLocation: (posizione di un particolare robot): * Non avrei bisogno di usare il comando SCAN per essere in grado di riprodurre il modello? Se così non è questo comando O (N) quindi non dovrei quindi eseguire la scansione di tutti i tasti in Redis? – user2924127
fammi avere un'idea in java (jedis) Set keys = jedis.keys ("GeoLocation:" + (posizione del robot) + "*"); restituirà tutte le chiavi corrispondenti per un particolare robot. Quindi passa attraverso quel set per ottenere i post e TimeStamp di cui hai bisogno. Questo sarà O (M) invece di O (N). Poiché stiamo eseguendo solo il ciclo delle chiavi corrispondenti a un determinato robot. E così riceverai tutti i messaggi da un particolare robot. –
Lo scopo è cercare di ottenere tutti i post creati da altri robot vicino alla posizione del robot, non i post creati da un robot specifico. – user2924127