Pokud pracujete s Javou a používáte Spring, je velká šance, že vaše klíče v Redis vypadají takto
\xac\xed\x00\x05t\x00\x0amyrediskey
Klíče v Redis mohou být pouze řetězce, ale Spring umožňuje ukládat i java objekty. Ve výchozím nastavení Spring převede objekt java pomocí serializátoru JDK. Serializátor JDK přidá tyto \xac\xed...
` bajtů.
Oprava je obvykle jednořádková změna - instruujte jaro, aby použila StringRedisSerializer. Tato změna se však týká pouze nových klíčů. Stávající klíče zůstanou v Redis i nadále, ale nebudou přístupné pro java.
Pokud již máte data ve výrobě, musíte udělat více. Jedním z přístupů je přejmenovat klíče a zbavit se binárních dat.
Přejmenovat kódované klíče Java
Nedávno jsme vydali java skript, který takové klíče automaticky opravuje. Viz hashedin/redis-rename-java-encoded-keys.
Obecný přístup je:
- Naskenujte klíče a vyhledejte klíče začínající na
\xac\xed\x00\x05
- což je podpis pro objekty kódované v jazyce Java - Zkuste deserializaci na objekt Java.
- Pokud bude úspěšný a je-li objekt typu String, přejmenujte klíč
- Pokud se jedná o cluster, přejmenování klíče nebude fungovat. V takovém případě vypište a obnovte klíč pod novým názvem
Spuštění v produkci
- Nejprve musíte provést změnu kódu, abyste přestali používat Jdk Serializer
- V tomto okamžiku čtení z redis selže, protože kód hledá serializované objekty
- Nyní spusťte skript pro opravu dat
Budoucí vylepšení
- Chcete-li zkrátit prostoje, můžete prohledat databázi a uložit do vyrovnávací paměti všechny příkazy pro přejmenování. Poté proveďte změnu kódu a okamžitě spusťte příkazy pro přejmenování najednou.
- Zlepšete podporu clusteru. Aktuálně musíte běžet proti každému hlavnímu uzlu v clusteru