Нажатие нового кода в вашу производственную среду всегда является страшным делом (вот почему в этой профессии выживают только самые жесткие;)). Я настоятельно рекомендую, чтобы перед изменением производственного кода и базы данных убедитесь, что вы проверяете рабочий процесс и его результаты локально.
Практически любое обновление приложения требует его остановки, даже если это необходимо для замены соответствующих файлов. Это даже верно для любых изменений, которые связаны с базой данных именно по той причине, о которой вы говорили.
Даже если вы можете развернуть ваши изменения кода, не останавливая приложение как таковое (например, страницу PHP), вы все равно хотите, чтобы изменение базы данных выполнялось «атомарно», то есть без каких-либо запросов приложений, которые могли бы вмешаться и, возможно, были нарушены. Хотя некоторые базы данных могут быть отключены для обслуживания, даже тогда вы обычно останавливаете приложение, иначе ошибки будут генерироваться повсюду.
Если это действительно так, вы прекратите приложение (или поместите его в режим обслуживания) независимо от изменения базы данных, поэтому мы возьмем ваш вопрос, чтобы на самом деле означать: какой самый быстрый способ переименовать все/некоторые ключи в моей базе данных?
Чтобы ответить на этот вопрос, по аналогии с псевдо-код предложено выше, я предлагаю вам использовать скрипт Lua, такие как следующие и EVAL, как только вы остановите приложение:
for _,k in ipairs(redis.call('keys', 'user:*')) do
if k:sub(-5) ~= ':data' then
redis.call('rename', k, k .. ':data')
end
end
Несколько замечаний по этому поводу скрипт, который вы должны иметь в виду:
Хотя команда КЛЮЧИ не является безопасным для использования в производстве, так как вы делаете обслуживание его можно использовать безопасно. Для всех других случаев использования, где вам нужно отсканировать ключи, SCAN Redis гораздо более целесообразен.
Поскольку сценарии Lua являются «атомарными», вы можете теоретически запустить этот скрипт, не останавливая приложение, - пока скрипт работает (что зависит от размера вашего набора данных), запросы приложения будут заблокированы.Иными словами, этот подход решает проблему получения имен смешанных ключей (старый & новый). Это, однако, вероятно, не то, что вы хотели бы сделать в любом случае, потому что: а) ваше приложение все еще может быть ошибкой/таймаутом в течение этого времени, но главным образом потому, что b) он должен будет иметь возможность обрабатывать оба типа имен ключей (т.е. запуск со старыми ключами -> короткая/длинная пауза -> запуск с новыми клавишами) делает ваш код намного сложнее.
Условие if
не требуется, если вы собираетесь запускать сценарий только один раз и преуспеть.
В зависимости от фактического содержимого вашей базы данных вы можете захотеть отфильтровать ключи, которые не следует переименовывать.
Для обеспечения совместимости воздержитесь от hardcoding/вычислительно генерируя имена ключей - вместо этого они должны передаваться в качестве аргументов скрипту.