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

Всем привет. У меня есть вопрос касательно MsSQL и миграции, буду

рад услышать ваше мнение.

Допустим, в базе у меня лежат какие-то данные (2 миллиона записей). И в NoSql базе (Redis) лежит 3,5 миллионов записей, причем из них 2 миллиона записей так же деблируются с базой.

Я хочу написать джобу, которая будет переводить остаток (1,5 миллиона записей) в MsSql. Но так как для меня MsSql - зверь неизвестный, я решил обратиться сюда.

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

Особенности выборки в MsSql состоит в том, что по дефолту там ставится блокировка (shared lock, если не ошибаюсь). Потому с такими вещами нужно быть осторожным.

Примерный сценарий, по которому хочу построить миграцию:
1. Получить все данные из Redis, замапить их в map’у (это необходимо сделать потому, что без ключей я не смогу дополнить данные для переноса в базу, так они были изначально туда записаны) - ключ по которому данные лежат и сами значения

2. После чего я хочу взять и пройтись итеративно по этой мапке, чтобы собрать нужные INSERT’ы для mssql.

3. Используя jdbc template я хочу выполнить все эти INSERT’ы

Концепция достаточно простая, но кажется, что она не особо рабочая. Во-первым, на втором шаге мне придётся проверять базу (условно говоря выполнять некий database.findAllByParams(…), чтобф вообще понять, есть ли эти данные в базе или нет. Ну и да, сами данные могут удаляться как из Redis’а, так и из базы. Плюс ко всему, если разом попытаться это всё дело мигрировать, то можно просто потерять новые данные, ведь блокировка может усилить контеншон, а значит нужно делать таймауты.

Короче, как вы думаете, есть ли смысл как-то двигаться в эту сторону? Или проще завести третью таблицу в базе и не рисковать? Ну и да, для третьей таблицы там нужно будет лишь выполнить следующее:
redis data - database data

1 ответов

9 просмотров

А какой размер одной записи? Я бы закинул всё из редиса в отдельную табличку/базу на том же экземпляре и сливал все уже внутри SQL server. Shared lock можно убрать с помощью read committed snapshot в свойствах бд - но стоит протестировать, т.к. меняется логика и нагрузка на tempdb возрастает.

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

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

вопрос: кто как решает вопрос с динамической подгрузкой скриптов для отдельных страниц с включенным turbo router?
Sergei Toroptsev
25
Это что теперь, любой бот сможет принимать платежи без ебли с юр лицами?
Lencore
8
Всем привет, а может кто-то подсказать какие-то советы или типо того, как оптимальнее всего сапортить сервисы в разных локациях (канада + австралия + евпропа)? Будет ли ошибк...
Stas
8
Не догоняю немного каким боком тут эппл Вот есть веб (мини) апп, который по факту веб сайт, просто в телеге веб вью и если там оплата, то нежно вот эти приседания?
e\\/gen
7
Всем привет! Может кто поможет разобраться с чёрной магией? (во всяком случае для меня) Дело вот в чём - написал я код для общения с tmc2209 драйвером по half duplex uart. М...
pronvis
4
Друзья, за кем?
Magic
12
ого, спасибо Никит, ты как всегда кладезь нужной инфы! Сейчас пойду копаться, а мне релиз создать как и версию самого плагина? типа 1.0.8?
Alex Blaze
9
Всем привет. Кто-то может подсказать, как можно перевести значения Selection поля, если список значений в нем формируется динамически? Я изначально их получаю из selection дру...
Наталья Селезнева
6
Сonst magicTgHTML = (text, entities) => { let processedText = text; let offsetShift = 0; entities.forEach(entity => { const { offset, length, type, url, ...
Андрей
1
Почему Telegram пишет, что объект media не найден, хотя на самом деле я его передаю? Делаю на urllib, без зависимостей, так надо. Вызываю метод sendMediaGroup с таким JSON: ...
Alexey S
1
Карта сайта