172 похожих чатов

Вопрос про реализацию лайков. Есть правильная кастомная хранилка key=set<uint64>, где key

- идентификатор лайкаемого обьекта, uint64 = userid. Хранилка быстро возвращает len(set), даже если внутри миллиард интов и мы быстро видим число лайков у обьекта. Быстро - это b-tree, максимум 1 поход на диск. Медленнее, чем hyperloglog, но ведь нельзя лайенуть одно и то же дважды да и список лайкеров хочется запросить, так что хранить честный set лайкнувших - надо так или иначе.

Вопрос в том, как бы мне не делать 80 запросов в лайкохранилку при попытке показать страницу с 40 комментами. Ведь про каждый коммент надо спросить len(его set) и set.find(userid) дабы понимать лайкало это тело обьект или нет.

От set.find(uid) непонятно как избавиться - вещь нужная, а вот len(set) можно кешировать в uint32-поле (колонке "likes") самой сообщенечки. То есть, в коде "бизнес-логики", отправив запрос на добавление лайка в set, проапдейтить колонку likes новым значением len(set). Профит: число лайков лежит прямо в сообщеньке и показать 40 мессаг с лайками - скан рядом лежащих данных.

Проблема в нагрузке на update(message) при большом потоке лайков на него и в расссинхроне - когда сервис set-ов с лайками жив, а messages прилег на 5 минут. Ясно, что следующий лайк синхронизирует все как надо, но его может не быть. Хотя не банковские данные, потерять в счетчике лайков временно - не беда. Ну или можно такое правило: раз в N запросов ходить за len(set) - уточнять. Остался вопрос про прореживание - как делать update(message) не на каждый лайк, когда их валится стопицот тыщ. Хотя, этот update вроде не дорогой, да и даже самый популярный коммент на ютубе получает лайков порядка 5K, что не в одну секунду. Да и непонятно как прореживать - завести sizeclass как в аллокаторах? Ну типа до 100 лайков - апдейтить на каждый, до 1000 - на каждый 5-й и т.п.

в общем, прочьба поделиться мыслями про кеширование числа лайков внутри мессаги, про прореживание апдейтов и прочее.

3 ответов

16 просмотров

Не очень понятно почему именно постгрес в данном случае. Он с некоторыми оговорками подойдёт, но кислота для лайков это что-то странное Число лайков - если делать через постгрес - можно взять приблизительную оценку от автовакуума.

Казалось бы, при чём здесь постгрес?

Aleksandr Danilov 🇺🇦
Не очень понятно почему именно постгрес в данном с...

>Число лайков - если делать через постгрес - можно взять приблизительную оценку от автовакуума. По мне так лучшэ честно считать триггером.

Похожие вопросы

Обсуждают сегодня

А чем вам питонисты не угодили?😂
.
79
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Ещё такой вопрос. Мне необходимо хранить пароль пользователя локально. Для этого планирую использовать ini файл. Это для автозаполнения полей логин и пароль при авторизации. Е...
Евгений
19
Ты просто гитлеровскую эстетику плохо понимаешь. Он же всё под Цезаря делал. А это как бы запрещённый приём в политике. Пиджаки они зачем все носят? Чтобы показать что они тип...
Ivan Kropotkin
4
а чем лучше всего сделать глобальный лок, если много нодов, до сотни? ну то есть мне надо, чтобы некоторые операции с объектом не происходили одновременно. перемещение между н...
Д. П.
15
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
26
Hi guys, I'm looking for a good LLM course. Is there any course to learn LLMs in advanced? I'm aiming to use them in my apps, so a perfect course in my openion, is not only a ...
Taha
14
База данных не поможет. Шифрование не поможет. Какие там ещё варианты? Накидывайте.
КТ315
20
А табстоп это сообщение от окна или от элемента управления?
The Bird of Hermes
18
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
Карта сайта