
Мерлин
03.03.2018
21:10:04
Народ, а посоветуйте плз - может, есть готовое решение для хранения переменных/объектов/структур в памяти, типа мап, но при этом с возможностью индексирования и поиска не только по основному ключу, но и, например, по значениям переменных в хранимых структурах? Ну или там, с ручным заданием нескольких ключей для индексирования и поиска
Для чего нужно: есть большушая куча объектов в бд, сложных, со связями между собой, с которыми постоянно необходимо что-то делать (через опр.промежутки времени)
Постоянно терзать бд для их выбора - неоптимально, можно ведь держать все в памяти и дергать базу только ддя обновлений и, например, периодических синхронтзаций
Но хочется делать это удобно :)
Погугли в сторону golang embedded in memory dB
Есть несколько штук

Wingman
03.03.2018
21:10:55
но таки большинство инмемори - это key-value, а мне хочется мультикей

Slava
03.03.2018
21:20:46
Мультикей это как?

Google

Wingman
03.03.2018
21:21:44
да это я из головы слово взял

Slava
03.03.2018
21:22:20
А как оно в голове работает?

Wingman
03.03.2018
21:22:55
в идеале - как sql %)

Slava
03.03.2018
21:23:24
В sql обычно есть уникальный первичный ключ

Wingman
03.03.2018
21:23:42
ну, грубо, вот псевдокод:
m = map[key1, key2]SomeType
map[key1=a,key2=b] = SomeObj
а потом
obj := map[a]
obj := map[b]
ну то есть ключ может быть не один
и уникальность не обязательна

Slava
03.03.2018
21:24:50
Ну вообщем нет

Wingman
03.03.2018
21:24:57
ну да, я понял

Slava
03.03.2018
21:25:45
Но по сути вопроса - иметь свою презентацию в памяти того, что есть в базе - это гибельный путь
Любая субд сама поддерживает подобное представление в памяти

Wingman
03.03.2018
21:26:12
хз, на каждый чих дёргать тоже не хочется

Google

Slava
03.03.2018
21:26:16
Этим и надо пользоваться
У тебя только один клиент у базы будет?

Wingman
03.03.2018
21:27:04
скорее да, чем нет

Slava
03.03.2018
21:27:07
Если нет, то ты на синхронизациях будешь в разв медленнее той же базы

Anonchik
03.03.2018
21:27:09
Прошу прощения, но мб новичкам будет полезно https://t.me/studygo

Slava
03.03.2018
21:27:45
Relatited :)

Wingman
03.03.2018
21:32:31
Но по сути вопроса - иметь свою презентацию в памяти того, что есть в базе - это гибельный путь
ладно, совсем близкий к жизни пример, а то у меня абстракции непонятные получаются :)
Есть, например, какое-то сетевое оборудование
Оно опрашивается раз в какое-то время
При каждом опросе проверяется куча разных штук — например, по какому-то протоколу обнаруживаются соседи (такие же железки) на каждом порту свитча
на одной железке 50 портов ; у каждого порта - уже найденные ранее соседи ; при каждом опросе нужно смотреть — изменилось ли что-либо с предыдущего опроса, если да — обновлять данные в БД
таких железок - тысячи
при достаточно частом опросе - получится тупое непрерывное дрочево БД постоянной выборкой одних и тех же данных, в 99% случаев неизменных :(
ну и да, так или иначе, в каком-то виде, всё равно мне нужно в памяти список оборудования держать, чтобы запускать его периодические опросы


Slava
03.03.2018
21:39:35
А зачем в базу сохранять? Это где-то потом использоваться будет?

Wingman
03.03.2018
21:42:58
да, конечно

Viacheslav
03.03.2018
21:45:21
навскидку - выглядит как обычная событийная модель, взять rabbitmq или кафку. В принципе можно попытаться модель твиттера натянуть на задачу - смотреть видео как твиттер это реализовал на редисе.

Wingman
03.03.2018
21:46:48
гм, rabbitmq - это же про очереди и сообщения, а не про бд и кеш?

Viacheslav
03.03.2018
21:47:43
ну цель по сути обновлять бд после какого-либо события и если произошло какое-либо событие уведомить свех заинтересованных лиц, так?
с кешами засада в держании их в консистентном состоянии с базой и это сложно

Wingman
03.03.2018
21:48:24
не совсем
яж не о событиях спрашивал изначально :)

Viacheslav
03.03.2018
21:48:40
ну хозяин - барин)

Wingman
03.03.2018
21:48:42
блин, а в го так не работает, чтоли?
`switch(...) {
case 1:
case 2:
doSomething
}`
case 1 никогда не ловится

Google

Wingman
03.03.2018
21:52:12
всё, понял :)

Denis
03.03.2018
22:15:44
Товарищи, есть тут кто активно контрибьютит в open-source?
Хочу влиться в проект.

Slava
03.03.2018
22:35:04
Так выбирай любой

Виктор
03.03.2018
22:52:19
Выбирай тот что тебе нравится. Или в тот что ты и так используешь
Пользы больше будет

Pawel
04.03.2018
08:18:53
>при достаточно частом опросе - получится тупое непрерывное дрочево БД постоянной выборкой одних и тех же данных
вам нужен твердотельный кеш для приборов.
Храните оборудование по значению в обычном слайсе,
Сделайте слайс потокобезопасным
Сделайте апдейт базы с подавлением "дребезга" (см. debounce)

Michael
04.03.2018
09:30:51

Wingman
04.03.2018
11:11:38

Zaur
04.03.2018
11:12:21

Wingman
04.03.2018
11:13:12
будет настраивабельно, но в среднем - опросы от раз в минуту до раз в 5 минут на каждую железку
это куча запросов: выборка самой железки, кучи её параметров, компонентов, связей

Zaur
04.03.2018
11:18:31
Скорее всего, Вы зря беспокойтесь об этом. Современные БД удивительно производительны, единственное может Вам придётся немного времени уделить правильному проектированию таблиц и индексов

Eugene
04.03.2018
11:18:39
@wingz может это вам подойдет https://tarantool.io/en/product/unwired-iiot.html

Zaur
04.03.2018
11:18:58
Попробуйте сначала без кеша

Wingman
04.03.2018
11:19:57
Попробуйте сначала без кеша
я примерно представляю и уже делаю без кеша :)
но сами по себе бессмысленные массовые непрерывные выборки - не нравятся и хочется избежать

Eugene
04.03.2018
11:21:57
там не key-value, есть будут вопросы -то можно поспрашивать тут https://t.me/tarantoolru

Wingman
04.03.2018
11:22:35
Ага, благодарю

Google

Wingman
04.03.2018
11:22:52
#wingz
(для поиска позезностей)

Pawel
04.03.2018
11:43:06

Wingman
04.03.2018
11:43:46
ну так а если у меня вся база работает на это приложение? :)

Zaur
04.03.2018
14:12:11
Ребзя, встречайте гостя

Admin
ERROR: S client not available

Michael
04.03.2018
14:20:50

Denis
04.03.2018
18:28:28
Товарищи, пробую tcp read write в redis, отвечать мне вообще не хочет.
Есть идеи почему такое может быть?
При этом telnet получает ответ

Pawel
04.03.2018
18:37:56

The
05.03.2018
00:42:59
Подскажите, есть ли отстойность в таком решении. На вход в функцию подаю канал значений, внутри функции проверяю на существующие значения в базе (мне нужны только новые), на выход из функции отдаю канал из новых значений.. в цикле прямо так и делаю:
for item := range values {
// check if item is new
newValues <- item
}
return newValues

Zver
05.03.2018
00:58:33

The
05.03.2018
00:58:54
да, он там обернут, забыл упомянуть :)

Zver
05.03.2018
00:59:35

Zaur
05.03.2018
00:59:38
И newValues должен передаваться в функцию

The
05.03.2018
01:01:16

Zver
05.03.2018
01:01:19

The
05.03.2018
01:02:39
я кстати закрыть канал забыл, вот это уже косяк

Zver
05.03.2018
01:02:50

Zaur
05.03.2018
01:04:08
Асинхронно запущенная функция возвращает новый канал?

Google

Zaur
05.03.2018
01:04:20
Я что-то перестал понимать

The
05.03.2018
01:04:25
нет, она без go запущена
https://i.imgur.com/AFTk3jd.png
вот так

Zver
05.03.2018
01:05:12

Zaur
05.03.2018
01:05:14
Ааа, все, дошло ))

The
05.03.2018
01:05:50
спасибо за фидбек, господа!

Zaur
05.03.2018
01:07:08
А разве для go не надо передавать переменные в функцию все равно?

The
05.03.2018
01:07:44
если go внутри for
а тут for внутри go :)

Zver
05.03.2018
01:08:29

Zaur
05.03.2018
01:08:57
Ясно, спс)

The
05.03.2018
01:09:29
он видимо имеет ввиду когда for а потом спавним горутину на каждый элемент цикла, тогда нужно в функцию аргументами передавать, если тип не ссылочный
хотя гоню, там даже не от ссылочного типа зависит.
там все нужно передавать через аргументы функции в горутину

Zver
05.03.2018
01:12:20
Ясно, спс)
Пример кода из pipeline pattern на эту тему.
func sq(in <-chan int) <-chan int {
out := make(chan int)
go func() {
for n := range in {
out <- n * n
}
close(out)
}()
return out
}