setHashValueSerializer設定項目にばねデータRedisのばねredistemplateを使用するredisTemplateのシリアル化を与えられて格納された地図データをspringboot用い、そこ\ XAC \ XED \ X00 \ x05t \ X00

これは、一度シリアライズ方法の異なる種類を使用するために、キーのRedis

デフォルトさらにツールの所与のタイプ(配列はスプリングRedisTemplateのデシリアライゼーション高速の比と言われている)から、以下の配列によって修飾使用、JdkSerializationRedisSerializer、StringRedisSerializer

輸入com.dyuproject.protostuff.LinkedBuffer;
輸入com.dyuproject.protostuff.ProtostuffIOUtil;
輸入com.dyuproject.protostuff.Schema;
輸入com.dyuproject.protostuff.runtime.RuntimeSchema;
輸入org.springframework.data.redis.serializer.RedisSerializer;
輸入org.springframework.data.redis.serializer.SerializationException。

パブリック クラス ProtostuffSerializer 実装 RedisSerializer <OBJECT> { 

    プライベート ブールのisEmpty(バイト[]データ){
         リターン(データ== NULL || data.length == 0 )。
    }

    民間 最終スキーマ<ProtoWrapper> スキーマ。

    民間 最終ProtoWrapperラッパー。

    民間 最終LinkedBufferバッファと、

    パブリックProtostuffSerializer(){
         この .wrapper = 新しいProtoWrapper()。
        この .schema = RuntimeSchema.getSchema(ProtoWrapper。クラス)。
        この .buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE)。
    } 

    @Override 
    公共 バイト []シリアライズ(オブジェクトt)はスローSerializationException {
         場合(Tは==NULL ){
             戻り 新しい バイト [0 ]。
        } 
        wrapper.data = T。
        試す{
             戻りProtostuffIOUtil.toByteArray(ラッパー、スキーマ、バッファ)。
        } 最後に{ 
            buffer.clear()。
        } 
    } 

    @Override 
    パブリックオブジェクトデシリアライズ(バイト []バイト)スローSerializationException {
         場合(のisEmpty(バイト)){
             戻り ヌル
        }

        ProtoWrapper newMessage = schema.newMessage()。
        ProtostuffIOUtil.mergeFrom(バイト、newMessage、スキーマ)。
        返すnewMessage.dataを。
    } 

    プライベート 静的 クラスProtoWrapper { 

        パブリックオブジェクトデータ、

    } 
}

私は、次の例外が発生しました:

ハッシュ操作:java.lang.ClassCastExceptionが:java.lang.Integerのではないjava.lang.Stringでにキャストできる、別のためのこの時間後、シリアライゼーションクラスのハッシュ

template.setHashValueSerializer(新しい Jackson2JsonRedisSerializer <>(オブジェクト。クラス));

ハッシュ値を使用ProtostuffSerializerのシーケンスの最後には、次の操作を与えられたので、

HashOperations <文字列、文字列、T> hashOperations = redisTemplate.opsForHash()。

        もし(値のinstanceofロング||値instanceofの整数||値のinstanceofショート||値のinstanceof バイト)
        { 
            長いのlongValue = ((番号)値).longValue(); 
            hashOperations.increment(キー、フィールド、のlongValue)。
        } 

        であれば(値のinstanceofフロート||値instanceofの  ダブル)
        { 
            二重のdoubleValue = ((番号)値).doubleValue(); 
            ダブル返さ= hashOperations.increment(キー、フィールド、-0.005 )。
        } 
        戻り hashOperations。

报错如下:io.lettuce.core.RedisCommandExecutionException:ERRのハッシュ値が有効な浮動小数点数ではありません

、ProtostuffSerializerが変形されたハッシュ値のシーケンスの後にあるため、プログラミング、\ X0A = \データ\ X5A \ X43 XC形式、数値計算誤差。

 

注:Redisのデータが変換に関連してのみ、long double型とをサポートし、インクリメント操作を終了します。

たとえば、著者は、コードを次のエラーは次のようになります。

 パブリック <T> T getCacheHashValue(文字列キー、文字列フィールド、クラス<T> targetClass){ 
        HashOperations <文字列、文字列、T> hashOperations = redisTemplate.opsForHash()。
        リターンhashOperations.get(キー、フィールド); 
    }

 

求心性

フロートバランス= cacheService.getCacheHashValue(cacheKey、 "バランス"、フロート。クラス)。

エラー:

java.lang.ClassCastExceptionが:によって引き起こさjava.lang.Doubleのはjava.lang.Floatのにキャストすることはできません

 

redisTemplate関連記事:

springbootプロジェクトのシーケンスをマッピングするために、スプリング・データ・Redisの与えられた時間を利用して

使用redisTemplateデータを格納し、そこに\ XAC \ XED \ X00 \ x05t \ X00

 

おすすめ

転載: www.cnblogs.com/passedbylove/p/12084731.html