Slava
Slava
почему забавно? =)
.
Ну, весело объясняешь
.
И вполне интересно
Slava
спасибо =)
Slava
к сожалению не знаю, что с каучбейз =)
Nik
Nik
Если мускул пустой более менее норм, то что посерьёзнее уже тяжело поднимать на рабочей тачке
Nik
Потому в CI и на серверах тестить
Nik
И тесты на чистых инстансах
Nik
А пока ты кодишь, играясь с базой, и на ней же тестишь - это уже не совсем чистый тест
Sebor▂▅▇█▓▒░
можно держать 2 инстанса - дев и тест
Nik
Если это два тонких sql то да. Если базы тяжеловаты, или само хранилище более требовательно - то уже нет
Sebor▂▅▇█▓▒░
ну как то же тестят терабайтные базы 🙂
Slava
наверное не тестят =)
Nik
Slava
ну или тестят только производительность/верность данных
Slava
у нас девелоперское окружение работает в амазоне
Slava
на 16гб инстансах
Slava
на локальной машине всю память голанд съедает на пару с хромом )
Nik
Slava
в тестах не обязательно все данные тащить ведь
Sebor▂▅▇█▓▒░
Slava
ну и другой момент, не обязательно все тесты запускать при разработке. а в CI они могут и час отрабатывать
Nik
Nik
И все объём надо крутить на ci перед деплоем на чистом окружении
Nik
И разойтись спать🙂
Slava
не понял последнего аргумента =) но не важно
Nik
))
Заур
heavycharged
подскажите, как правильней всего организовать мапу с TTL?
мне нужно, чтобы каждое значение мапы жило допустим около 60 секунд, а потом удалялось. как это делается? создается горутина, которая делает слип и потом удаляет элемент мапы?
Nikita
Vladimir
heavycharged
Мне пока нужно для понимания работы, есть где применить в принципе, но пока обходился без этого.
Vladimir
Nikita
к счастью исходники go пакетов читабельны
heavycharged
я просто вижу пару решений:
1) на каждый элемент мапы - спящая горутина, которая по таймауту удалит по ключу значение из мапы. мне кажется, самое плохое решение.
2) при добавлении элемента, пишем в какую-то другую мапу значение когда нужно удалить элемент, а по ней итерируемся и лочим через мьютексы её, если нужно удалить, при этом можно иногда ложить в сон эту горутину, до близжайшего элемента который нужно удалить.
3) нагромоздить что-то вроде очереди, в которой первый элемент это всегда самый ближний на удаление, а при добавлении собственно добавляем в то место, где элемент -1 удалится раньше, а элемент +1 удалится позже.
и это только то, что удалось придумать мне.
какая из этих реализаций лучше, черт его знает.
heavycharged
у меня иногда проблемы с чтением чужих сурцов
heavycharged
Хорошо когда есть комменты, а то вот допустим:
type Cache struct {
*cache
// If this is confusing, see the comment at the bottom of New()
}
🏁Александр
я просто вижу пару решений:
1) на каждый элемент мапы - спящая горутина, которая по таймауту удалит по ключу значение из мапы. мне кажется, самое плохое решение.
2) при добавлении элемента, пишем в какую-то другую мапу значение когда нужно удалить элемент, а по ней итерируемся и лочим через мьютексы её, если нужно удалить, при этом можно иногда ложить в сон эту горутину, до близжайшего элемента который нужно удалить.
3) нагромоздить что-то вроде очереди, в которой первый элемент это всегда самый ближний на удаление, а при добавлении собственно добавляем в то место, где элемент -1 удалится раньше, а элемент +1 удалится позже.
и это только то, что удалось придумать мне.
какая из этих реализаций лучше, черт его знает.
есть еще стандартные таймеры в гоу
🏁Александр
https://golang.org/pkg/time/#After
heavycharged
да, но это ж на каждый элемент горутину нужно
heavycharged
или как по другому?
heavycharged
там же вроде 8к горутин накидал и все)
Slava
Можно без таймеров
🏁Александр
можно 1 гоурутиной 🙂
Slava
Хранишь дату обновления
Slava
При доступе - проверяешь не протухло ли
Slava
Можно самому иногда делать резет протухших значений, если очень нужно
Slava
Дату обновления хранишь для каждого значения и вместе с ним
🏁Александр
погодите! щаз я сделаю реализацию
heavycharged
да, подчищать точно надо, вот собственно и вопрос, как это делать, лочить мапу и проитерироваться по ней, так как других способов ходить по мапе пока в неё пишут я не знаю. я поэтому и думаю, что лучше сделать отдельный (буферизированный) канал, куда сливать даты очисток и клюки для удаления, там уже горутина примет и когда нужно удалить - отправит сигнал об удалении туда, где собственно и работают с основной мапой. но честно говоря хз, я вообще с этим параллельным кодом не давно работаю, поэтому не представляю себе как это на практике организовать лучше.
Vladimir
Slava
Зачем канал то?
heavycharged
А полезный навык же
навык то точно полезный, но что поделать) когда начинаются поинтеры и unsafe я подвисаю иногда
Slava
Делай свой тип
Slava
И лоч доступы
Vladimir
Vladimir
Глобальный лок, удаление при доступе если протухло
Vladimir
И если очень нужно есть горутина одна которая подчищает протухлость
🏁Александр
екарный плейграуд
🏁Александр
шо он творит 🙁
heavycharged
Ну у нас есть map[string]Entry, type Enrty struct {Value: interface{}, LastAccess: int64}
Подчищалка же полюбому залочит эту мапу?
heavycharged
по другому же никак?
Slava
Или ринг с мапами ;)
heavycharged
или я чего-то не понимаю?
Slava
Удалять протухшие мапы из ринга автоматом
Vladimir
heavycharged
что за ринг?
Slava
Забудь про ринг
Slava
Это на следующий уровень оставим
heavycharged
heavycharged
ты изверг
Slava
Владимир дело говорит ;)
Slava
Почитай готовую имплементацию
heavycharged
ладно, но про ринг то скажи, это паттерн или что, как гуглить