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

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

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

26 ответов

60 просмотров

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

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

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

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

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

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

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

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта