Ако работите с Java и използвате Spring, има голяма вероятност вашите ключове в Redis да изглеждат така
\xac\xed\x00\x05t\x00\x0amyrediskey
Ключовете в Redis могат да бъдат само низове, но Spring ви позволява да съхранявате и java обекти. По подразбиране Spring ще конвертира java обекта с помощта на JDK сериализатор. JDK сериализаторът добавя тези \xac\xed...
` байтове.
Корекцията обикновено е промяна в 1 ред - инструктирайте spring да използва StringRedisSerializer. Но тази промяна засяга само новите ключове. Съществуващите ключове ще продължат да останат в Redis, но ще бъдат недостъпни за java.
Ако вече имате данни в производството, трябва да направите повече. Един подход е да преименувате ключове и да се отървете от двоичните данни.
Преименуване на Java кодирани ключове
Наскоро пуснахме java скрипт, който автоматично коригира такива ключове. Вижте hashedin/redis-rename-java-encoded-keys.
Общият подход е:
- Сканирайте ключовете и потърсете ключове, започващи с
\xac\xed\x00\x05
- което е подписът за java кодирани обекти - Опитайте да десериализирате в java обект.
- Ако е успешен и ако обектът е от тип String, преименувайте ключа
- Ако е клъстер, ключът за преименуване няма да работи. В такъв случай изхвърлете и възстановете ключа под новото име
Изпълнение в производствения режим
- Първо трябва да промените кода, за да спрете да използвате Jdk Serializer
- В този момент четенето от redis няма да е успешно, защото кодът търси сериализирани обекти
- Сега започнете да изпълнявате скрипта, за да коригирате данните
Бъдещи подобрения
- За да намалите времето на престой, можете да сканирате базата данни и да буферирате всички команди за преименуване. След това направете промяната на кода и незабавно изпълнете командите за преименуване наведнъж.
- Подобрете поддръжката на клъстери. В момента трябва да работите срещу всеки главен възел в клъстера