Jeśli pracujesz z Javą i korzystasz ze Springa, istnieje spora szansa, że Twoje klucze w Redis wyglądają tak
\xac\xed\x00\x05t\x00\x0amyrediskey
Klucze w Redis mogą być tylko ciągami, ale Spring pozwala również przechowywać obiekty java. Domyślnie Spring przekonwertuje obiekt java za pomocą serializatora JDK. Serializator JDK dodaje te \xac\xed...
` bajtów.
Poprawka jest zwykle zmianą jednowierszową — poinstruuj spring, aby używała StringRedisSerializer. Ale ta zmiana dotyczy tylko nowych kluczy. Istniejące klucze pozostaną w Redis, ale będą niedostępne dla Javy.
Jeśli masz już dane w produkcji, musisz zrobić więcej. Jednym ze sposobów jest zmiana nazw kluczy i pozbycie się danych binarnych.
Zmień nazwy kluczy zakodowanych w języku Java
Niedawno wydaliśmy skrypt java, który automatycznie naprawia takie klucze. Zobacz hashedin/redis-rename-java-encoded-keys.
Ogólne podejście to:
- Skanuj klucze i szukaj kluczy zaczynających się od
\xac\xed\x00\x05
- która jest sygnaturą obiektów zakodowanych w javie - Spróbuj zdeserializować do obiektu java.
- Jeśli się powiedzie, a obiekt jest typu String, zmień nazwę klucza
- Jeśli jest to klaster, klucz zmiany nazwy nie zadziała. W takim przypadku zrzuć i przywróć klucz pod nową nazwą
Uruchamianie w środowisku produkcyjnym
- Najpierw musisz dokonać zmiany kodu, aby przestać używać Jdk Serializer
- W tym momencie odczyty z redis zakończą się niepowodzeniem, ponieważ kod szuka zserializowanych obiektów
- Teraz zacznij uruchamiać skrypt, aby poprawić dane
Przyszłe ulepszenia
- Aby skrócić czas przestoju, możesz skanować bazę danych i buforować wszystkie polecenia zmiany nazwy. Następnie dokonaj zmiany kodu i natychmiast uruchom polecenia zmiany nazwy za jednym razem.
- Popraw obsługę klastrów. Obecnie musisz uruchamiać się na każdym węźle głównym w klastrze