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

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

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

26 ответов

64 просмотра

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

Там вроде надо думать в сторону щардирование с 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 с локом на запись и через них осуществлять доступ к мапе

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

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

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

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

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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта