У вашего кода есть несколько проблем, вы можете оптимизировать их, чтобы он работал намного быстрее.
Слишком много запросов к Redis.
Если ключ не существует, для каждой записи,Вы отправляете 2 запроса в Redis.Если ключ уже существует, для каждой записи вы отправляете 3 запроса в Redis.Таким образом, для 50 миллионов записей вы отправляете 100-150 миллионов запросов в RedisТам будет много времени туда и обратно.Так что это будет очень медленно.
Вместо этого вы можете заключить свой код в Lua-скрипт , и для каждой записи отправлять запрос в Redis только один раз.
ТакжеВы код не атомарный.Если в Redis отправлено более одного клиента, ваш код нарушается.Тем не менее, с помощью сценариев Lua вы можете убедиться, что код является атомарным, что позволяет оптимизировать секунды.
Повышение параллелизма
Похоже, что вы отправляете запрос в Redis с помощью одного потока/процесс.Redis очень быстрый, однако ваш клиент работает слишком медленно.Таким образом, вы можете разделить свои записи на несколько частей.Для каждой части создайте новый поток для отправки запроса в Redis.Конечно, вы должны убедиться, что ваш код поточно-ориентирован, проверьте первую оптимизацию.
Уменьшите количество записей
Из вашего примера в ваших записях много дублирующихся MD5 и разные идентификаторы,Так много запросов к Redis не разрешено, так как они будут перезаписаны последующими запросами.Таким образом, вы можете выполнить (внешнюю) сортировку и удалить эти дубликаты перед отправкой запросов в Redis.