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

О кстати, мне товарищ ещё рассказывал как-то залип на собесе,

попросили его на мапе сделать кеш ин мемори, ну он сделал, с rw мьютексом, потом говорят ну вот у нас нагрузка на него 100500 мильенов и на мьютексах тратится время как обойти проблему? Решили шардировать мапу (в структуре что представляет из себя кеш слайс мап), в итоге он завалил эту задачу. Но я так прикинул, блин а как бы я её делал и походу тоже завалил бы. Ну допустим в методе Get мы по ключу находим кеш, потом по индексу равному кеш%длина слайса кладём мапу, ток слайс же тоже не потокоьезопасен все равно мьютекс нужен, то ж на то и выходит

26 ответов

20 просмотров

Атомиками нужно было?

Там вроде надо думать в сторону щардирование с map[string]map[string]string

Артём-Лазаренко Автор вопроса
Andrey Treyel
Там вроде надо думать в сторону щардирование с map...

А какая разница мьютексах все равно нужно использовать

Артём Лазаренко
А какая разница мьютексах все равно нужно использо...

Кажется что от них не уйти, тип можно подумать в сторону sync.Map , но по моему она в данном случае не на много поможет

Артём Лазаренко
А какая разница мьютексах все равно нужно использо...

мьютекс на каждый шард и на саму коллекцию шардов надо

Артём-Лазаренко Автор вопроса
Артём Лазаренко
И за счёт чего будет выигрыш?

за счет того, что когда ты мутируешь какой-то ключ и берешь WLock, ты берешь эксклюзивную блокировку только на один шард, а из других шардов в это время можно читать, получая неэксклюзивную блокировку RLock

Артём-Лазаренко Автор вопроса
Sergey Topala
за счет того, что когда ты мутируешь какой-то ключ...

Хотя не, всеравно в Get/Set нужно делать лок (на весь гет/ сет) т.к. Нужно сделать потоеобезопасно чтение и запись в слайс шардов (в элемент слайса)

Классика, создаёшь массив мап и массив мьютексов. Индекс в массиве это хеш от ключа. Вычисляешь хеш ключа и рв-лок на нужную мапу на запись. Главное хорошую хеш-функцию подобрать.

Артём Лазаренко
Хотя не, всеравно в Get/Set нужно делать лок (на в...

В гет/сет ты будешь делать RLock почти всегда, WLock исключительно редко, а RLock неэксклюзивный и в целом должен работать быстрее. Ну или можно сделать массив бакетов иммутабельным, как Иван выше подсказал, что позволит избавиться от одного лока и в целом упростит задачу.

Sergey Topala
мьютекс на каждый шард и на саму коллекцию шардов ...

не надо на коллекцию шардов, ты их заранее определяешь, они статические

https://github.com/patrickmn/go-cache/tree/master

Aleksandr Prilipko
такое на литкоде обьясняют?

нет конечно, литкод проверяет алгоритмическое мышление, вопрос на дизайн потокобезопасного мемкеша про примитивы синхронизациии имхо

Sergey Topala
нет конечно, литкод проверяет алгоритмическое мышл...

это была неудавшаяся провокация, на поиск источника мудрости) запрос на источник знаний

Aleksandr Prilipko
это была неудавшаяся провокация, на поиск источник...

я работал шарпистом, а "библия" шарпа, которая clr via c#, неплохо объясняет примитивы. и по работе задачи такого рода попадались.

При таких мильонах операций может возникать cache contention и вот там уже sync.Map хорошо себя проявит На хабре как-то видел статью об этом Это вряд ли даст такой же ощутимый выигрыш как шардирование, но иметь ввиду стоит

а чем он не потокобезопасен, если мы его не меняем? и да, обычно размер бакетов фиксированные и можно обойтись массивами

Можно иметь две мапы: обычную и мапу мьютексов. Ключи в двух мапах одинаковые. Тогда при обновлении обычной мапы будем лочить не целую мапу, а лишь key-value поле

Уставший Гофер
Можно иметь две мапы: обычную и мапу мьютексов. Кл...

Что-то не совсем понял зачем лочить мапу, можно сделать два метода readMap с локом на чтение и setMap с локом на запись и через них осуществлять доступ к мапе

destroyer.86
Что-то не совсем понял зачем лочить мапу, можно сд...

Можно, но в условии сказано, что это будет медленно

Kirill D
все равно будет крашить на записях

При добавлении новых записей в мапу - да. При обновлении существующих - нет

Уставший Гофер
При добавлении новых записей в мапу - да. При обно...

не бывает обновления существующих разве что в мапе вы храните указатель, и тогда обновление мапы касается только в части чтения

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
49
читать файл максимально быстро? странный вопрос))
zamtmn
53
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
How to create an OS in C? what to study?
Linus
18
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
@HemulGM Параметры у AddStream поменялись? Несостыковка какая-то
Катерина Свиридова
12
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Народ, с прошедшими и наступающими. Ща полную ересь прогоню, но фишка в том, что это не обычная алкогольная ересь Либера, а я реально хз что делать. Сайт с 2012-го года Косяк...
Alexey Liber
1
Карта сайта