sql >> データベース >  >> NoSQL >> Redis

Javaでシリアル化されたRedisキーを修正する方法

    Javaを使用してSpringを使用している場合、Redisのキーが次のようになる可能性がかなりあります

    \xac\xed\x00\x05t\x00\x0amyrediskey

    Redisのキーは文字列のみですが、SpringではJavaオブジェクトも保存できます。デフォルトでは、SpringはJDKシリアライザーを使用してJavaオブジェクトを変換します。 JDKシリアライザーはそれらの\xac\xed...を追加します `バイト。

    修正は通常1行の変更です-StringRedisSerializerを使用するようにSpringに指示します。ただし、この変更は新しいキーにのみ影響します。既存のキーは引き続きRedisに残りますが、Javaにはアクセスできなくなります。

    すでに本番環境にデータがある場合は、さらに多くのことを行う必要があります。 1つのアプローチは、キーの名前を変更し、バイナリデータを削除することです。

    Javaエンコードキーの名前を変更

    最近、このようなキーを自動的に修正するJavaスクリプトをリリースしました。 hashedin/redis-rename-java-encoded-keysを参照してください。

    一般的なアプローチは次のとおりです。

    1. キーをスキャンし、\xac\xed\x00\x05で始まるキーを探します -これは、Javaでエンコードされたオブジェクトの署名です
    2. Javaオブジェクトに逆シリアル化してみてください。
    3. 成功し、オブジェクトのタイプがStringの場合は、キーの名前を変更します
    4. クラスターの場合、名前変更キーは機能しません。その場合は、新しい名前でキーをダンプして復元します
    本番環境での実行
    1. Jdk Serializerの使用を停止するには、最初にコードを変更する必要があります
    2. この時点で、コードはシリアル化されたオブジェクトを探しているため、redisからの読み取りは失敗します
    3. 次に、スクリプトの実行を開始してデータを修正します
    将来の改善
    1. ダウンタイムを減らすために、データベースをスキャンして、すべての名前変更コマンドをバッファリングできます。次に、コードを変更して、すぐに名前変更コマンドを一度に実行します。
    2. クラスターのサポートを改善します。現在、クラスター内の各マスターノードに対して実行する必要があります

    1. Mongoは、文字列として保存されているすべての数値フィールドを変換します

    2. MongoDBレプリケーションに「アービター」が必要なのはなぜですか?

    3. 'process.nextTick(function(){throw err;})'-未定義は関数ではありません(mongodb / mongoose)

    4. Mongo:特定のフィールドがないアイテムを検索する