Как работает серверная часть свайпов/совпадений в приложении, похожем на трут, на основе свайпов?

Я пытаюсь разработать приложение, которое воспроизводит ленту на основе Tinder. Идея приложения очень похожа на Tinder, а также есть свайп вправо и влево с функцией сопоставления.

Что я сделал до сих пор: я создал коллекцию свайпов в MongoDB, в которой хранятся свайпы пользователя в следующей схеме:

swipedBy : {type:Schema.ObjectId},
swipedUser : {type:Schema.ObjectId},
status: {type:String, default:"left"}

Когда пользователь проводит пальцем вправо, я звоню в БД. Для каждой вставки салфетки я пытаюсь определить, был ли пользователь пропущен правильно другим пользователем, прежде чем сказать, что это совпадение, или сохранить его в БД. Там должен быть лучший способ.

Возможное решение

Я хотел использовать базу данных в памяти, такую ​​​​как Redis, для хранения аналогичной информации и поиска совпадений между пользователями на основе свайпов. Если кто-то может пролить свет на то, как это делает трут, это тоже будет полезно. Моя схема в Redis выглядит так:

HSET for each user with 
- userId as field, and 
- status as swipe status

Но проблема с этим подходом в том, что я не смогу отследить, пролистнул ли уже пользователь конкретного человека, который нужен во время фида. Единственное, что можно сделать для решения этой проблемы, — обновить коллекцию и сохранить список уже удаленных пользователей.

Если есть какая-либо другая база данных/способ, которая может помочь мне в этом процессе, пожалуйста, предложите и ее.

Изменить:

Я не натыкаюсь на узкое место. Я просто хочу убедиться, правильно ли я делаю или нет. Итерация по списку для выяснения того, был ли пользователь пролистнут вправо другим человеком, является решением с линейным временем. Мне было интересно, могу ли я сделать лучше, либо через БД, либо что-то еще, что я должен попробовать.


person vijaykrishnavanshi    schedule 29.01.2018    source источник
comment
Почему должен быть лучший способ? Какая проблема у вас с этим? (Слишком много обращений к БД? Почему это важно для вас?)   -  person Cody G    schedule 29.01.2018
comment
Да, меня беспокоит слишком много обращений к БД @CodyG.   -  person vijaykrishnavanshi    schedule 29.01.2018
comment
Хорошо, так почему это важно для вас? То есть, вы попали в узкое место? Какие требования к производительности вы пытаетесь выполнить? Что вы тестировали --- т.е. сколько транзакций вы доказали, что можете писать с помощью Mongodb? Почему этого недостаточно?   -  person Cody G    schedule 29.01.2018
comment
@КодиГ. Я не натыкаюсь на узкое место. Я просто хотел убедиться, правильно ли я делаю или нет. Итерация по списку для выяснения того, был ли пользователь пролистнут вправо другим человеком, является решением с линейным временем. Мне было интересно, могу ли я сделать лучше, либо через БД, либо что-то еще, что я должен попробовать. Только по этой причине я также упомянул, какое решение я придумал для этой задачи.   -  person vijaykrishnavanshi    schedule 30.01.2018
comment
Вы нашли лучшее решение?   -  person fsljfke    schedule 02.08.2020


Ответы (1)


Я не знаю, действительно ли это решает ваш запрос, но вы можете попробовать

  • Имейте отдельный фильтр Блума, чтобы проверить, соответствует ли он... могут быть ложные срабатывания, но, поскольку большинство будет «еще не сопоставлено», это сэкономит много запросов к базе данных.
  • Если это еще не совпадение, и вам нужно сохранить скопированную запись данных, сохраните несколько таких записей в памяти / Redis на некоторое время, а затем массово вставьте в базу данных.
  • обновлять фильтр Блума в режиме реального времени (Примечание: может быть временное несоответствие между Блумом и базой данных, пока не будет выполнена массовая вставка.)
person Vidur Khanna    schedule 30.01.2018