Я участвую в процессе обучения 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) Затем я смог бы получить все сообщения рядом с роботом, отправив место географии, в котором он находится. Крушение здесь - мне также нужно будет включить его 8 соседей-геохашей, для которых потребуется еще 8 запросов. Именно поэтому я также рассматриваю концепцию пространственной близости для этой функции.
HGETALL [GeoHash Location of robot]
Затем будет возвращено поле ([timestamp]) и значение ( "0" );
3) Истечение старых сообщений. Поскольку я не могу использовать команду EXPIRE для удаления полей из hashset, мне тогда нужно будет периодически проверять все поля 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 км.
3) Затем я застрял, как удалить старые сообщения